反射能不能创建一个变量 ?

xkb11111 2014-09-12 05:33:05
反射能不能创建一个变量

类A 有aa bb 2个变量 能不能加个cc变量
...全文
184 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
java_liyi 2014-09-13
  • 打赏
  • 举报
回复
这种应该面向切面编程(Aop)的问题 用自定义类加载器来试着演示一下这个问题 引用jar包:javassist-3.15.0-GA.jar

import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtField;
import javassist.Loader;
import javassist.NotFoundException;
import javassist.Translator;


/**
 * 实现javassist.Translator接口
 * @author Administrator
 *
 */
public class AopTest implements Translator{
	/**
	 * 以AopTest类的main作为入口方法
	 * @param args
	 * @throws NotFoundException 
	 */
	/**
	 * @param args
	 */
	public static void main(String[] args){
		try {
			AopTest aopTest = null;
			ClassPool classPool = ClassPool.getDefault();
			Loader loader = new Loader();
			loader.addTranslator(classPool, aopTest = new AopTest());
			loader.run("A", args);//调用真正的入口,这里以A.main方法为入口
		} catch (Throwable tr) {
			// TODO Auto-generated catch block
			tr.printStackTrace();
		}
	}

	@Override
	public void onLoad(ClassPool classPool, String className) throws NotFoundException,
			CannotCompileException {
		// TODO Auto-generated method stub
		if(!"A".equals(className)){
			return;
		}
		
		CtClass ctClass = classPool.get(className);
		//在A类中织入一个int型的Field,名称为Field
		CtField ctField = new CtField(CtClass.intType, "Field1",ctClass);
		//给A的这个新增Field赋一个初值123
		ctClass.addField(ctField, "123");
		
	}

	@Override
	public void start(ClassPool arg0) throws NotFoundException,
			CannotCompileException {
		// TODO Auto-generated method stub
		
	}
}

/**
 * 在类加载时被修改的测试类
 * @author Administrator
 *
 */
public class A {
	/**
	 * 注意,A中并没有定义任何Field
	 * @throws Exception
	 */
	public A() throws Exception{
		for(java.lang.reflect.Field f : A.class.getDeclaredFields()){
			System.out.println(f.getName()+":"+f.get(this));
		}
	}
	
	public static void main(String[] args) throws Exception {
		A a = new A();
	}
}
打印结果 Field1:123 希望这个例子能帮助你
kiyoki 2014-09-13
  • 打赏
  • 举报
回复
我始终没明白当年达内的XX老师说反射的最高境界是在反射里修改一个类的意思 因为我至今不会用反射帮类添加一个成员变量 也不会修改类里面的方法
skyWalker_ONLY 2014-09-13
  • 打赏
  • 举报
回复
不可以创建变量。反射是动态修改对象的属性或者调用对象,或者创建新的实例,创建变量就相当与修改了原有的class文件了
ghx287524027 2014-09-13
  • 打赏
  • 举报
回复
在Java中可以利用反射得到对应的类中的变量和方法,但是创建变量应该是不可以的
糖几颗的 2014-09-13
  • 打赏
  • 举报
回复
不能创建 , 只能赋值
zhjdg 2014-09-12
  • 打赏
  • 举报
回复
不行, 想aop效果吗
rumlee 2014-09-12
  • 打赏
  • 举报
回复
你这种用反射当然做不到了,动态编译才可以做到啊。 不过你这种应用何必非要用类呢,直接用一个map来解决我觉得肯定简单多了啊。你希望增加一个属性,直接调用set就完了。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧