比如说现在我有这样的一个类package com.test1;import java.lang.reflect.Method;public class Test {
private Integer id;
public static void main(String[] args)throws Exception{
Class cla = Class.forName("com.test1.Test");
try {
/*下面的这行代码将会抛出以下异常:
Exception in thread "main" java.lang.NoSuchMethodException: com.test1.Test.getId()
at java.lang.Class.getDeclaredMethod(Class.java:1937)
at com.test1.Test.main(Test.java:9) */
Method method = cla.getDeclaredMethod("getId",new Class[]{});
} catch (NoSuchMethodException e) {
/* Method method = cla.getDeclaredMethod("getId",new Class[]{});这行代码的
* 异常将在这里被捕获(原因是找不到指定的方法),在这个catch里面我就想动态的给cla创建一个getId()
* 的这样一个方法,可是在这 我就不知道该怎么写了 望各位赐教? */
//像我说的这种需要 ,现在的jdk能做到吗?
e.printStackTrace();
}
}
}
在上面的这个类中,id属性没有相应的getter方法!我想要的结果就是:程序在运行中可以动态的给Test类加上getter方法,
强调:只是在运行的时候,让Test类可以使用getter方法,并不是要在Test.java这个文件里面加上相应的getter方法
private Integer id;
public static void main(String[] args)throws Exception{
Class cla = Class.forName("com.test1.Test");
try {
/*下面的这行代码将会抛出以下异常:
Exception in thread "main" java.lang.NoSuchMethodException: com.test1.Test.getId()
at java.lang.Class.getDeclaredMethod(Class.java:1937)
at com.test1.Test.main(Test.java:9) */
Method method = cla.getDeclaredMethod("getId",new Class[]{});
} catch (NoSuchMethodException e) {
/* Method method = cla.getDeclaredMethod("getId",new Class[]{});这行代码的
* 异常将在这里被捕获(原因是找不到指定的方法),在这个catch里面我就想动态的给cla创建一个getId()
* 的这样一个方法,可是在这 我就不知道该怎么写了 望各位赐教? */
//像我说的这种需要 ,现在的jdk能做到吗?
e.printStackTrace();
}
}
}
在上面的这个类中,id属性没有相应的getter方法!我想要的结果就是:程序在运行中可以动态的给Test类加上getter方法,
强调:只是在运行的时候,让Test类可以使用getter方法,并不是要在Test.java这个文件里面加上相应的getter方法
请问楼主,方法是什么?那是一段子程序的入口,进入子程序之后不是简单的一个 setter 方法就完事了,可能还要做很复杂的逻辑运算,还有可能再调用子程序。试问如果支持动态添加方法,那么简单的加上一个方法名和参数列表之后,方法内部的程序代码怎么办,也要动态产生吗?
楼主想要的这个结果是无法实现的,即使能实现sun也会出补丁将他卡掉,因为这是违反数据封装原则的,是bug。
一个class被JVM加载后,在内存中的模型基本已经定下来了,不可能再改了,楼上有人说用cgiLib,要知道cgiLib其实是给你动态做了一个子类。
getField只能访问public成员
貌似动态增加类成员的方法在编译语言中几乎没有,解释语言中倒是常见,例如PYTHON,用setattr(obj, member)就可以做到,obj是一个class或对象,member可以是属性也可以是方法,很方便灵活,但是有的时候看代码就觉得挺乱了。看代码,明明没有定义的方法,在别的地方居然有调用,找半天才找到是动态加入的……