//执行c类中m(setbtn)方法
public void jButton1_actionPerformed(ActionEvent e) {
System.out.println("ssssssssss");
try {
invoke(c,m);
}
catch(Exception ex) {
System.err.println(ex.getMessage());
}
}
//Mcl 类名
//Mname 方法名 : setbtn
public static Object invoke(Class Mcl,String Mname) throws Exception {
Method m = Mcl.getDeclaredMethod(Mname);
Constructor cm = Mcl.getConstructor();
boolean accessFlag = m.isAccessible();
m.setAccessible(true);
Object object = m.invoke(cm.newInstance());
m.setAccessible(accessFlag);
return object;
}/////////////////下面代码是Mcl类中的一个方法 public void setbtn() {
System.out.println("bbbbbbbbbbbbbbbbbbbbbbb");
System.out.println(jButton1.getText()+" kkkkkkkkkkkkbbbbbbbbbbbbbbbbbbbbbbb");
jButton1.setText("sssss");
System.out.println("aaaaaaaaaaaaaaaaa");
System.out.println(jButton1.getText()+" pppppppppppppppppppp");
}
点击jButton1执行反射调用另外一个类的方法,m方法是执行了,其中方法内部的打印也打印出来了,问题是没什么反应,在类c中有一个按钮,我在另外一个类中写的反射代码,要把类c中的jButton1文本更改,在另外类执行反射方法后,都正常执行,就是按钮名还是不变,这是为什么?
public void jButton1_actionPerformed(ActionEvent e) {
System.out.println("ssssssssss");
try {
invoke(c,m);
}
catch(Exception ex) {
System.err.println(ex.getMessage());
}
}
//Mcl 类名
//Mname 方法名 : setbtn
public static Object invoke(Class Mcl,String Mname) throws Exception {
Method m = Mcl.getDeclaredMethod(Mname);
Constructor cm = Mcl.getConstructor();
boolean accessFlag = m.isAccessible();
m.setAccessible(true);
Object object = m.invoke(cm.newInstance());
m.setAccessible(accessFlag);
return object;
}/////////////////下面代码是Mcl类中的一个方法 public void setbtn() {
System.out.println("bbbbbbbbbbbbbbbbbbbbbbb");
System.out.println(jButton1.getText()+" kkkkkkkkkkkkbbbbbbbbbbbbbbbbbbbbbbb");
jButton1.setText("sssss");
System.out.println("aaaaaaaaaaaaaaaaa");
System.out.println(jButton1.getText()+" pppppppppppppppppppp");
}
点击jButton1执行反射调用另外一个类的方法,m方法是执行了,其中方法内部的打印也打印出来了,问题是没什么反应,在类c中有一个按钮,我在另外一个类中写的反射代码,要把类c中的jButton1文本更改,在另外类执行反射方法后,都正常执行,就是按钮名还是不变,这是为什么?
打印的结果已经是sssss了,为什么在界面中的按钮没有变化,不是界面刷新的问题,因为在同一类里执行这个方法jButton1的文本是变化的
你设置了新对象的按钮的文本,但是新对象并没有在界面上显示。换句话说,你的Mcl对象的jButton1的文本并没有设置,所以看不到效果。
这写的好像有问题,应该编译时就会出错的,因为Method的invoke必须要两个参数invoke
public Object invoke(Object obj,
Object... args)
throws IllegalAccessException,
IllegalArgumentException,
InvocationTargetException对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换。
如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。 如果底层方法所需的形参数为 0,则所提供的 args 数组长度可以为 0 或 null。 如果底层方法是实例方法,则使用动态方法查找来调用它,这一点记录在 Java Language Specification, Second Edition 的第 15.12.4.4 节中;在发生基于目标对象的运行时类型的重写时更应该这样做。 如果底层方法是静态的,并且尚未初始化声明此方法的类,则会将其初始化。 如果方法正常完成,则将该方法返回的值返回给调用者;如果该值为基本类型,则首先适当地将其包装在对象中。但是,如果该值的类型为一组基本类型,则数组元素不 被包装在对象中;换句话说,将返回基本类型的数组。如果底层方法返回类型为 void,则该调用返回 null。
参数:
obj - 从中调用底层方法的对象
args - 用于方法调用的参数
返回:
使用参数 args 在 obj 上指派该对象所表示方法的结果
抛出:
IllegalAccessException - 如果此 Method 对象强制执行 Java 语言访问控制,并且底层方法是不可访问的。
IllegalArgumentException - 如果该方法是实例方法,且指定对象参数不是声明底层方法的类或接口(或其中的子类或实现程序)的实例;如果实参和形参的数量不相同;如果基本参数的解包转换失败;如果在解包后,无法通过方法调用转换将参数值转换为相应的形参类型。
InvocationTargetException - 如果底层方法抛出异常。
NullPointerException - 如果指定对象为 null,且该方法是一个实例方法。
ExceptionInInitializerError - 如果由此方法引起的初始化失败。
换成Object object = m.invoke(cm));或Object object = m.invoke(Mcl);在点击按钮时
报object is not an instance of declaring class这个错
cm.newInstance()是new 了一个数对像,感觉3楼说的应该对,不过怎么改呢
应该怎么做啊