反射就是在运行中能动态获取到一个类的所有信息。能够调用这个类的任意方法,属性和构造方法等。还可以反编译,就是 .class>>.java
我们可以利用他来封装一些方法或者其他工具类。
下面是利用反射获取一个类的成员变量的代码示例
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class ReflectDemo {
public static void main(String[] args) throws Exception {
//成员变量
System.out.println("成员变量");
//加载类 ,类名具体到哪个包下
Class<?> class2 = Class.forName("com.cgg.reflect.Person");
//返回这个类下的所声明的所有字段
Field[] fields = class2.getDeclaredFields();
//循环获取到这个类所声明的字段名称
for (Field field : fields) {
StringBuilder builder = new StringBuilder();
//修饰符
builder.append("\t" + Modifier.toString(field.getModifiers()));
//类型
builder.append(" " + field.getType().getSimpleName());
//名称
builder.append(" " + field.getName());
//输出变量
System.out.println(builder.toString());
}
}
}
//person类
public class Person {
private String name;
private int age;
private Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
private void test() {
System.out.println("private void test 这是个私有的方法");
}
public String say(String txt) {
return age + "岁的" + name + "说:\"" + txt + "\"";
}
}