Java反射
程序员文章站
2024-01-21 15:03:16
...
Java反射使用
通过反射,构造对象,并使用反射调用方式访问对象的public/private方法和字段。
<!--EndFragment-->
public class TestBean {
private String string;
public TestBean() {
System.out.println("无参构造方法被调用");
}
public TestBean(String string) {
System.out.println("有参构造方法被调用");
this.string = string;
}
public String getString() {
System.out.println("属性获取被调用");
return string;
}
public void setString(String string) {
System.out.println("属性设置被调用过");
this.string = string;
}
public void doPublic() {
System.out.println("无参公共方法被调用过");
}
public String doPublic(String param1, Integer param2) {
System.out.println("有参公共方法被调用过");
return "参数1是:" + param1 + " 参数2是:" + param2.toString() + " 附加消息:" + string;
}
private String doPrivate() {
System.out.println("无参私有方法被调用过");
return "私有方法doPrivate()被调用了!";
}
private String doPrivate(String param) {
System.out.println("有参私有方法被调用过");
return "参数是" + param + "附加消息:" + string;
}
}
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.*;
public class Test {
public static void main(String[] args) throws NoSuchMethodException,
InvocationTargetException, IllegalAccessException,
InstantiationException, NoSuchFieldException {
// 通过反射方式创建对象
Class clazz = TestBean.class; //这一步是第一步,就是获取Class类
//通过获取构造函数来创建对象,还有其它方法
TestBean testBean = (TestBean) clazz.getConstructor().newInstance();
// 直接调用属性设置方法
testBean.setString("通过Class方式创建一个对象,并调用对象上的方法!");
// 通过反射方式调用属性设置方法
//这一步是获取方法实例,和声明方法一样,我们需要有方法名,参数类型,感觉很像C语言中的头文件
Method m_setString = clazz.getMethod("setString", String.class);
//通过invoke来执行方法,这个invoke的功能很想JavaScript中的apply
m_setString.invoke(testBean, "通过反射调用了testBean对象上的一个方法!");
// 通过反射方式调用对象的带参public方法
Method m_public = clazz.getMethod("doPublic", String.class,
Integer.class);
String re = (String) m_public.invoke(testBean, "张三", 200);
System.out.println(re);
// 通过反射方式调用对象的无参public方法
m_public = clazz.getMethod("doPublic");
re = (String) m_public.invoke(testBean);
System.out.println(re);
// 通过反射方式调用对象的带参private方法
Method m_private = clazz.getDeclaredMethod("doPrivate", String.class);
m_private.setAccessible(true); //注意这里,所有的私有方法和字段,都需要这个方法
m_private.invoke(testBean, "张三");
// 通过反射方式调用对象的无参private方法
m_private = clazz.getDeclaredMethod("doPrivate");
m_private.setAccessible(true);
m_private.invoke(testBean);
// 通过反射方式访问对象private字段
Field f_private = clazz.getDeclaredField("string");
f_private.setAccessible(true);
f_private.set(testBean, "hahahahahahahaha");
System.out.println(testBean.getString());
}
}
上一篇: QQ的焦虑 都被写进微信小程序里了