感谢这篇博客: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;
}
}
1.无参构造:
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);
}
}
从写法上来,好像下边的要麻烦一些。运行结果:
2.有参构造:
//调用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());
都是穿内衣给他老公看。还是反射麻烦些。
3.获取属性值:
为了更好的区分,此时需要在美女类加一个私有属性。
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));
利用反射暴力获取值,发现他俩想的都不是你!!!
4.给属性赋值
让俩美女都想你!
//赋值
customer1.love1="我自己";
System.err.println(customer1.love1);
Field f = clazz.getDeclaredField("love2");
f.setAccessible(true);
f.set(customer,"我自己");
System.err.println(""+f.get(customer));
开心吗?都是你了!
5.调用方法
//调用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,按需分析情况。
为了更好的贴合主题,举例一种!
6.贴合主题的例子
在美女对象中加入
private void getStr(String[] name,int password){
for (int i=0 ;i<name.length;i++){
if (password==123456) {
System.err.println(name[i] + ":其实我真正爱的是隔壁老王");
}else{
System.err.println("密码输入错误,你看不到我心里的想法");
}
}
}
私有方法,传统方式没法子调用。
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<fields.length;i++){
Field field=fields[i];
String fieldName=field.getName();
System.out.println("具体属性参数:"+fieldName);
}
//获得对象的所有方法
Method[] declaredMethods = clazz.getDeclaredMethods();
for (int i=0; i<declaredMethods.length;i++){
Method methods = declaredMethods[i];
String methodName=methods.getName();
System.out.println("所有方法名称:"+methodName);
}
这就好比你的女朋友心里想的不仅不是你,而且她穿的什么颜色的内衣已经他们嘿嘿嘿的方式,都应经被你知道了,你现在是不是觉得头上有点奇怪的东西!
加入我们
如果有需要,欢迎可以加入我们的QQ群!(QQ搜索 1074281704, 加入我们的QQ群吧!)
有任何问题,也可以加入我们的QQ群,欢迎交(che)流(dan)!