如果你看到这篇总结,想了解反射。我的建议是,你先把代码复制到idea或者Myeclipse中,然后逐个测试运行一下,结合注释,将会对反射有个了解。
1.百科关于反射的定义
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制
2.首先建立两个类Customer.java和TestReflect.java
(https://img-blog.csdn.net/20180909184034984?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25iYV9saW5zaHVoYW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
3.Customer.java代码如下
package com.company;
public class Customer {
private int id;
private String name;
//无参构造方法 每个类默认都会有
public Customer(){}
//有参构造方法
public Customer(String name,int id){
this.id=id;
this.name=name;
}
//属性id、name的set、get方法
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} }
4.TestReflect.java代码如下
package com.company;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class TestReflect {
//main主程序入口
public static void main(String[] args){
TestReflect.getProperty();
}
//静态方法,可以用类名.静态方法直接调用
public static void getProperty(){
try {
//获取对象类型 包名.类名 ?代表任意类型对象
Class<?> classType=Class.forName("com.company.Customer");
//通过反射获取Customer类里面所有的属性 id、name,因为有多个属性,所以用数组接收值
Field[] fields=classType.getDeclaredFields();
for (int i=0;i<fields.length;i++){
Field field=fields[i]; //取出每一个属性
String fieldName=field.getName(); //取出每个属性的名字
// System.out.println(fieldName); //代码到这,打印结果为:id,name
//通过拼接获取方法名字如getId 、getName setId 、setName
// 1.将属性的第一个字母截取出来并且大写
//例如Id 从下标0到下标1取出字母为i
String firstLetter= fieldName.substring(0, 1).toUpperCase();
//2.拼接属性对应的get和set方法名字 下标从1开始,不设定截止下标
String getMethodName="get"+firstLetter+fieldName.substring(1);
String setMethodName="set"+firstLetter+fieldName.substring(1);
// System.out.println(getMethodName); 打印输出getId getName
// System.out.println(setMethodName); setId setName
/*获取get方法、set方法
getMethod()第一个参数是方法名字如getId ,第二个参数是传过来参数的类型,
如Customer类中的getId()内没有参数类型,所以第二个参数为new Class[]{}
如setId(int id),第二个参数为new Class[]{int.calss} */
Method getMethod=classType.getMethod(getMethodName,new Class[]{});
//因为setId(int id) setString(String name) 有String和int,所以用field.getType()获取参数类型
Method setMethod=classType.getMethod(setMethodName,new Class[]{field.getType()});
//System.out.println(getMethod);
//System.out.println(setMethod);
/* 输出结果为
public int com.company.Customer.getId()
public void com.company.Customer.setId(int)
public java.lang.String com.company.Customer.getName()
public void com.company.Customer.setName(java.lang.String)
*/
/*创建对象
Customer customer=new Customer(); 常规通过new创建对象
通过反射创建对象 通过有参构造方法创建对象 */
Object obj= classType.getConstructor(String.class,int.class).newInstance("张三",20);
// Object obj= classType.getConstructor(new Class[]{String.class,int.class}).newInstance(new Object[]{"张三",20});
/*执行方法
//执行get方法获取对象的属性值,第一个参数为对象obj,第二个参数为get方法内的参数
get方法没有参数,所以括号内为new Object[]{} ,get方法有参数的话()内 为new Object[]{11,12}
get方法有参数的话,invoke()内可简写为invoke(obj,11,12) */
Object value=getMethod.invoke(obj,new Object[]{});
// System.out.println("执行了方法"+getMethodName+",得到的值为"+value);
//执行了set方法动态赋值
Object obj2=setMethod.invoke(obj,new Object[]{value});
// Object obj2=setMethod.invoke(obj,value); 简化版
System.out.println("执行了方法"+getMethodName+",得到的值为"+value);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
该链接是java反射运用的小实例
(https://blog.csdn.net/nba_linshuhao/article/details/82561165)