java反射可以不像一般情况下的new,只需要反射对象就可以。
本人使用的是Spring boot上用的,在java上一样使用不需要其他架包。
首先需要一个bean叫student类:
public class Student {
private int id;
private String name;
private String age;
public Student(int id, String name, String age) {
this.id = id;
this.name = name;
this.age = age;
}
public Student() {
}
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;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
}
然后是反射的简单使用方法:
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
@Component
public class MyFanShe {
Logger logger=Logger.getLogger(getClass());
Class aClass;
String className;
public String getName(){
try {
// 这里的类是复制的全路径
aClass = Class.forName("com.example.druid.fan_she.Student");
className = aClass.getName();
logger.info(className);
// 获取student类下的所有的方法
Method[] methods = aClass.getDeclaredMethods();
for (Method m:methods){
logger.info(""+m);
}
logger.info("下面是获取student类下的属性(字段)");
Field[] declaredFields = aClass.getDeclaredFields();
for (Field f:declaredFields){
logger.info(""+f);
}
logger.info("student类下的所有构造方法");
Constructor[] declaredConstructors = aClass.getDeclaredConstructors();
for (Constructor c:declaredConstructors){
logger.info(c);
}
//获取构造方法、方法使用如下:
try {
Constructor setId = aClass.getConstructor(int.class,String.class,String.class);
Object o = aClass.getDeclaredConstructor().newInstance();
Method toString = aClass.getMethod("toString", null);
Student student= (Student) setId.newInstance(1,"休息休息吧","20");
logger.info(student.getAge()+" "+student.getName()+" "+student.getId() );
Method getId = aClass.getMethod("getId", null);
Object invoke = getId.invoke(student, null);
logger.info("invoke="+invoke);
logger.info(setId);
} catch (Exception e) {
e.printStackTrace();
}
// 第二个
// 需要反射的类
Class myclass=Class.forName("com.example.druid.fan_she.Student");
// 获取类的构造方法
Constructor constructor = myclass.getConstructor(int.class, String.class, String.class);
// student得到反射的类,是通过构造方法实现的
Student student= (Student) constructor.newInstance(7,"asdf","44");
// 获取它的方法
Method setId = myclass.getMethod("setId", int.class);
// 将值代理到类中,会替换构造方法的7
setId.invoke(student,5);
//从反射中获取方法,没有需要注入的参数的就可以不写参数只写方法名字
Method getId = myclass.getMethod("getId");
// 通过方法开始获取值然后打印,在没有参数的情况下不用写除类以外的参数
logger.info(getId.invoke(student));
} catch (Exception e) {
e.printStackTrace();
}
return className;
}
}
获取属性详细方法:
Field getField(String name)
返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。
Field[] getFields()
返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。
Field getDeclaredField(String name)
返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
Field[] getDeclaredFields()
返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
获取构造方法:
Constructor<T> getConstructor(Class<?>... parameterTypes)
返回一个 Constructor 对象,它反映此 Class对象所表示的类的指定公共构造方法。
Constructor<?>[] getConstructors()
返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。
以前的一个方法过时了,采用了新的方式,旧的方式是:
aClass.newInstance();
新的:
aClass.getDeclaredConstructor().newInstance();
上面程序结果为(本人使用的是Spring boot上用的,在java上一样不需要其他架包):
2018-06-05 17:23:20,704 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] com.example.druid.fan_she.Student
2018-06-05 17:23:20,748 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] public java.lang.String com.example.druid.fan_she.Student.toString()
2018-06-05 17:23:20,748 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] public java.lang.String com.example.druid.fan_she.Student.getName()
2018-06-05 17:23:20,748 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] public void com.example.druid.fan_she.Student.setName(java.lang.String)
2018-06-05 17:23:20,748 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] public int com.example.druid.fan_she.Student.getId()
2018-06-05 17:23:20,748 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] public void com.example.druid.fan_she.Student.setId(int)
2018-06-05 17:23:20,749 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] public java.lang.String com.example.druid.fan_she.Student.getAge()
2018-06-05 17:23:20,749 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] public void com.example.druid.fan_she.Student.setAge(java.lang.String)
2018-06-05 17:23:20,749 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] 下面是属性(字段)
2018-06-05 17:23:20,749 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] private int com.example.druid.fan_she.Student.id
2018-06-05 17:23:20,749 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] private java.lang.String com.example.druid.fan_she.Student.name
2018-06-05 17:23:20,750 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] private java.lang.String com.example.druid.fan_she.Student.age
2018-06-05 17:23:20,750 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] 所有的构造方法
2018-06-05 17:23:20,750 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] public com.example.druid.fan_she.Student(int,java.lang.String,java.lang.String)
2018-06-05 17:23:20,750 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] public com.example.druid.fan_she.Student()
2018-06-05 17:23:20,751 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] 20 休息休息吧 1
2018-06-05 17:23:20,751 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] invoke=1
2018-06-05 17:23:20,751 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] public com.example.druid.fan_she.Student(int,java.lang.String,java.lang.String)
2018-06-05 17:23:20,752 yyyy-MM-dd HH:mm:ss INFO [com.example.druid.fan_she.MyFanShe] 5