反射的定义
Java本身属于静态语言,但是有着一个非常突出的动态机制;反射,即在程序运行时加载、探知、使用编译期间完全未知的classes。从class对象中获取构造函数、成员变量、方法、类等元素的反射对象,并通过这些对象对目标类对象进行操作。
反射所需的类
Class类:所在位置 java.lang.Class<T> 不提供public构造方法,由JVM通过调用类加载器的defineClass方法自动构造
Constructor类:所在位置 java.lang.reflect.Constructor<T> T-在其中声明构造方法的类
Method类:类或接口上单独某个方法的信息,所反映的方法可能是某类方法或实例方法(包括抽象方法)
Field类:提供有关类或接口的单个字段的信息,以及对它的动态访问权限。
反射API
使用反射API获取当前Java虚拟机中的类、接口、成员变量、方法等信息。
类:
java.lang.Class#public static Class<?> forName(String className) throws ClassNotFoundException
构造器:
java.lang.Class#public Constructor<T> getConstructor(Class<?> ... parmeterTypes) throws NosuchMethod Exception, SecurityException
java.lang.Class#public Contructor<T> getDeclareConstructor(Class<?>... paramterTypes) throws NosuchException, SecurityException
成员变量
java.lang.Class#public Field getField(String name) throws NoshFieldException, SecurityException
java.lang.Class#public Field getDeclaredField(String name) throws NoshFieldException, SecurityException
简单举例
//这是一个简单的模型对象
public class User {
private String name;
private int 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;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class UserReflect {
public static void main(String[] args) {
//1. 正常情况 使用new关键字
User user = new User();
System.out.println(user);
}
}
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
//使用反射。 Class.forName(全限定名);
Class<?> clazz = Class.forName("User");
User user = (User) clazz.newInstance();
System.out.println(user);
}
反射威力强大,只要稍微理解一下,很容易掌握。网上的例子也实在是很多了,没有必要重复举这么多例子。
网友评论