学习Java就不得不提Java的反射。
Java反射是指程序在运行过程中可以动态的获取类的属性与方法。主要是使用类Class来加载需要动态获取的类, Class类没有公有的构造方法,它由JVM自动调用(在new对象或者加载-classLoader时)。Class 类是在Java语言中 定义一个特定类的实现。一个类的定义包含成员变量,成员方法,还有这个类实现的接口,以及这个类的父类。Class类的对象用于表示当前运行的 Java 应用程序中的类和接口。
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
Java反射的应用,在Web应用中的拦截器其原理就是使用了Java的反射,(过滤器是基于函数回调)还有Spring强大的IOC也是应用Java的反射实现的。
public class Reflect {
public static void main(String[] args) throws Exception {
// 加载类
Class<?> cls = Class.forName("com.xfl.reflect.User");
// 查看类的构造方法
Constructor<?> cs[] = cls.getConstructors();
System.out.println("构造方法个数:" + cs.length);
// 构造方法 传入参数
User user2 = (User) cs[1].newInstance("myname");
System.out.println(user2.getUsername());
// 获取指的构造函数
Constructor<?> c = cls.getConstructor(String.class);
User user3 = (User) c.newInstance("myname");
System.out.println(user3.getUsername());
Constructor<?> c2 = cls.getConstructor();
User user4 = (User) c2.newInstance();
System.out.println(user4.getUsername());
System.out.println("-------------");
// getDeclared获得所有属性
Field fields[] = cls.getDeclaredFields();
System.out.println(fields.length);
for (Field f : fields) {
System.out.println(f.getName());
}
// Field field = cls.getField("username");
Field field = cls.getDeclaredField("username");
// 使私有属性可访问
field.setAccessible(true);
System.out.println(field.get(user2));
// obj.username
// 获取方法
Method method = cls.getMethod("setUsername", String.class);
method.invoke(user2, "XFL");
Method method2 = cls.getMethod("getUsername");
System.out.println(method2.invoke(user2));
Method method3 = cls.getDeclaredMethod("getUsername");
method3.setAccessible(true);
System.out.println("私有get:" + method3.invoke(user2));
}
}
public class User {
private String username;
public User() {
System.out.println("调用User构造方法");
}
public User(String username) {
this.username = username;
System.out.println("调用带参数User构造方法");
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}