感谢这篇博客:https://blog.csdn.net/ju_362204801/article/details/90578678,让我对反射有了新的理解。
什么是反射?反射就是就是把Java类中的各个部分(成员变量,方法,构造方法,等),映射成一个个的Java对象,可以进行任意调用。打个贴合文章标题的比方,new一个对象,这个对象就是一个美女,她告诉你她今天传了一件性感内衣,然后啥都没告诉你,这时候你灵光一现使用反射即可了解她穿这件内衣始末!下面会通过代码解释!
/**
* 创建一个美女对象类
*/
public class Beauty {
/**
* 对象名字
*/
public String name;
/**
* 对象穿内衣原因
*/
private String reason;
/**
* 内衣大小
*/
private double size;
public Beauty() {
System.err.println("无参构造:穿内衣");
}
public Beauty(String name, String reason, double size) {
this.name = name;
this.reason = reason;
this.size = size;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name=name;
}
public String getReason() {
return reason;
}
public void setReason(String reason) {
this.reason = reason;
}
public double getSize() {
return size;
}
public void setSize(double size) {
this.size = size;
}
}
public class Test {
public static void main(String[] args) throws Exception {
//传统创建一个对象
Beauty customer = new Beauty();
//利用反射创建一个对象
Class clazz = Class.forName(customer.getClass().getName());
//调用无参构造
clazz.getConstructor(null).newInstance(null);
}
}
从写法上来,好像下边的要麻烦一些。运行结果:
//调用Customer的有参构造
Beauty customer1 = new Beauty("佟丽娅","穿内衣给我老公看",36d);
System.out.println(customer1.getName());
//利用反射调用有参构造
customer = (Beauty)clazz.getConstructor(String.class,String.class,double.class).newInstance("高圆圆","穿内衣给我老公看",36d);
System.out.println(customer.getName());
都是穿内衣给他老公看。还是反射麻烦些。
为了更好的区分,此时需要在美女类加一个私有属性。
public String love1 = "陈思诚";
private String love2 = "赵又廷";
//传统获取属性值,获取不到2
System.out.println("让我看看她们在想谁");
System.err.println(customer1.love1);
//暴力获取私有属性
Field love2 = clazz.getDeclaredField("love2");
love2.setAccessible(true);
System.err.println(""+love2.get(customer));
利用反射暴力获取值,发现他俩想的都不是你!!!
让俩美女都想你!
//赋值
customer1.love1="我自己";
System.err.println(customer1.love1);
Field f = clazz.getDeclaredField("love2");
f.setAccessible(true);
f.set(customer,"我自己");
System.err.println(""+f.get(customer));
开心吗?都是你了!
//调用get,set方法
customer.setName("佟丽娅");
System.err.println(customer.getName());
//反射调用set方法
Method clazzMethod = clazz.getMethod("setName", String.class);
clazzMethod.invoke(customer,"高圆圆");
//反射调用get方法
Method m = clazz.getMethod("getName", null);
String returnValue = (String)m.invoke(customer, null);
System.err.println(returnValue);
此处情况众多,请参考文章https://blog.csdn.net/ju_362204801/article/details/90578678,按需分析情况。
为了更好的贴合主题,举例一种!
在美女对象中加入
private void getStr(String[] name,int password){
for (int i=0 ;i
私有方法,传统方式没法子调用。
Method m = clazz.getDeclaredMethod("getStr", String[].class,int.class);
m.setAccessible(true);
m.invoke(customer, (Object)new String[]{"佟丽娅","高圆圆"},123456);
看到这里你可能已经流泪了!那么接下来就是更流泪的事。
//获得对象的所有属性
Field fields[]=clazz.getDeclaredFields();
for (int i=0; i
这就好比你的女朋友心里想的不仅不是你,而且她穿的什么颜色的内衣已经他们嘿嘿嘿的方式,都应经被你知道了,你现在是不是觉得头上有点奇怪的东西!