Java反射机制可以让我们在运行期检查类、接口、变量、以及方法的信息。反射机制还可以让我们在运行期实例化对象,调用方法,通过调用get/set方法设置变量的值。
那么,通过Java的反射机制我们能获取到哪些信息呢?主要就是一下几大类:
- 类
- 构造器
- 变量(包括私有的)
- 方法(包括私有的)
- 访问器(Sitter/Getter)
- 注解
- 泛型
- 数组
- 动态代理
- 动态类加载与重载
下面通过操作Test类的代码来详细说明上述信息:
class Test{
private String name;
private int age;
Test(){ this.name="张三"; this.age=0; }
Test(String name,int age){this.name=name;this.age=age;}
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 void getInfo(){ System.out.println("name="+name+"...............age="+age); }
public void setInfo(String name,int age){this.name=name;this.age=age;}
}
通过Java反射机制得到类的包名和类名
public class ReflectionDemo {
public static void main(String[] args) {
Test test=new Test();
System.out.println(test.getClass().getPackage().getName()+"............"+test.getClass().getName());
}
}
通过Java反射机制得到一个类的构造器
public class ReflectionDemo {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InvocationTargetException, InstantiationException {
// Class<?> aClass = Class.forName("Reflection.Test");
Class<?> aClass=Test.class;
//得到构造函数的集合
Constructor<?>[] constructors = aClass.getConstructors();
//创建对象
Test test1 = (Test) constructors[0].newInstance();
test1.getInfo();
Test test2 = (Test) constructors[1].newInstance("王五",1);
test2.getInfo();
}
}
通过Java反射机制获取类中的成员
public class ReflectionDemo {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
Class<?> aClass=Test.class;
Field[] fieldValue=aClass.getDeclaredFields();
for(int i=0;i<fieldValue.length;i++)
System.out.println(fieldValue[i]);
}
}
通过java反射机制获取类中的方法
public class ReflectionDemo {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
Class<?> aClass=Test.class;
Method[]methods=aClass.getMethods();
for(int i=0;i<methods.length;i++)
System.out.println(methods[i].getReturnType()+" "+methods[i].getName());
}
}
通过Java反射机制获取类中的访问器
这里只举set的。
public class ReflectionDemo {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
Class<?> aClass=Test.class;
Method[]methods=aClass.getMethods();
for(Method method:methods){
if(isSetter(method)) System.out.println("Setter:.........."+method);
else System.out.println(method);
}
}
private static boolean isSetter(Method method) {
if(!method.getName().startsWith("set")) return false;
if(method.getParameterTypes().length != 1) return false;
return true;
}
}
注解、 泛型、 数组、 动态代理、动态类加载与重载 还没学习,学完再回来补充。