Java反射是Java被视为动态语言的一个关键性质。Java可以加载一个运行时才得知名称的class,获得其完整结构。
Reflection API
Java反射相关的API在包java.lang.reflect中
Member接口 | 该接口可以获取有关类成员(域或者方法)或构造函数的信息。 |
AccessibleObject类 | 是域(field)对象、方法(method)对象、构造函数(constructor)对象的基类。它提供了将反射的对象标记为在使用时取消默认 Java 语言访问控制检查的能力。 |
Array类 | 提供了动态创建和访问JAVA数组的方法。 |
Constructor类 | 提供一个类的构造函数的信息以及对它的访问权限。 |
Field类 | 提供一个类的域的信息以及对它的动态访问权限。 |
Method类 | 提供一个类的方法的信息以及如何访问该方法。 |
Modifier类 | 提供了 static 方法和常量,对类和成员访问修饰符进行解码。 |
Proxy类 | 提供动态地生成代理类和类实例的静态方法。 |
Java反射机制提供如下功能:
在运行时判断任意一个对象所属的类
在运行时构造任意一个类的对象
在运行时判段任意一个类所具有的成员变量和方法
在运行时调用任一个对象的方法
在运行时创建新类对象
生成动态代理
在使用Java的反射功能时,基本首先都要获取类的Class对象,再通过Class对象获取其他的对象。
System.out.println("获取类的Class对象>>>>>>>>>");
Boolean b1 = Boolean.FALSE;
Class<?> c = b1.getClass();
System.out.println(c);
Class<?> b2 = Boolean.class;
System.out.println(b2);
Class<?> c1 = Class.forName("java.lang.Boolean");
System.out.println(c1);
Class<?> c2 = Boolean.TYPE;
System.out.println(c2);
获取类的Class对象>>>>>>>>>
class java.lang.Boolean
class java.lang.Boolean
class java.lang.Boolean
boolean
package test;
/**
* 父类
*
*/
public class Animal {
public String name;
public int age;
protected String protectedField;
String defaultField;
private String privatedField;
public Animal() {
super();
}
public Animal(String name, int age) {
super();
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;
}
protected String getProtectedField() {
return protectedField;
}
protected void setProtectedField(String protectedField) {
this.protectedField = protectedField;
}
String getDefaultField() {
return defaultField;
}
void setDefaultField(String defaultField) {
this.defaultField = defaultField;
}
private String getPrivatedField() {
return privatedField;
}
private void setPrivatedField(String privatedField) {
this.privatedField = privatedField;
}
public String toString() {
return "Animal [name=" + name + ", age=" + age + "]";
}
}
package test;
/**
* 子类
*
*/
public class Dog extends Animal {
public int weight;
protected String protectedValue;
String defaultValue;
private String privatedValue;
public Dog() {
super();
}
protected Dog(String name, int age) {
super(name, age);
}
Dog(int weight) {
this.weight = weight;
}
private Dog(String name, int age, int weight) {
super(name, age);
this.weight = weight;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
protected String getProtectedValue() {
return protectedValue;
}
protected void setProtectedValue(String protectedValue) {
this.protectedValue = protectedValue;
}
String getDefaultValue() {
return defaultValue;
}
void setDefaultValue(String defaultValue) {
this.defaultValue = defaultValue;
}
private String getPrivatedValue() {
return privatedValue;
}
private void setPrivatedValue(String privatedValue) {
this.privatedValue = privatedValue;
}
private void bark() {
System.out.println("wang wang wang...");
}
public String toString() {
return "Dog [weight=" + weight + ", name=" + name + ", age=" + age + "]";
}
}
System.out.println("获取类的Fields>>>>>>>>>");
Class<?> d = Dog.class;
Field[] fields = d.getFields();
for (Field field : fields) {
System.out.println(field);
}
System.out.println("获取类的DeclaredFields>>>>>>>>>");
Field[] fields1 = d.getDeclaredFields();
for (Field field : fields1) {
System.out.println(field);
}
获取类的Fields>>>>>>>>>
public int test.Dog.weight
public java.lang.String test.Animal.name
public int test.Animal.age
获取类的DeclaredFields>>>>>>>>>
public int test.Dog.weight
protected java.lang.String test.Dog.protectedValue
java.lang.String test.Dog.defaultValue
private java.lang.String test.Dog.privatedValue
getFields返回的是该类及其父类中申明为public的属性。
getDeclaredFields返回的是该类中定义的所有属性。
System.out.println("获取类的Method>>>>>>>>>");
Method[] methods = d.getMethods();
for (Method method : methods) {
System.out.println(method);
}
System.out.println("获取类的DeclaredMethod>>>>>>>>>");
Method[] methods1 = d.getDeclaredMethods();
for (Method method : methods1) {
System.out.println(method);
}
获取类的Method>>>>>>>>>
public java.lang.String test.Dog.toString()
public int test.Dog.getWeight()
public void test.Dog.setWeight(int)
public java.lang.String test.Animal.getName()
public void test.Animal.setName(java.lang.String)
public int test.Animal.getAge()
public void test.Animal.setAge(int)
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public boolean java.lang.Object.equals(java.lang.Object)
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
获取类的DeclaredMethod>>>>>>>>>
public java.lang.String test.Dog.toString()
java.lang.String test.Dog.getDefaultValue()
private void test.Dog.bark()
public int test.Dog.getWeight()
public void test.Dog.setWeight(int)
protected java.lang.String test.Dog.getProtectedValue()
protected void test.Dog.setProtectedValue(java.lang.String)
void test.Dog.setDefaultValue(java.lang.String)
private java.lang.String test.Dog.getPrivatedValue()
private void test.Dog.setPrivatedValue(java.lang.String)
getMethods返回该类及其父类超类中申明为public的方法。
getDeclaredMethods返回该类中的所有方法,包括公共、保护、默认(包)访问和私有方法。
System.out.println("获取类的Constructor>>>>>>>>>");
Constructor<?>[] constructors = d.getConstructors();
for (Constructor<?> constructor : constructors) {
System.out.println(constructor);
}
System.out.println("获取类的DeclaredConstructor>>>>>>>>>");
Constructor<?>[] constructors1 = d.getDeclaredConstructors();
for (Constructor<?> constructor : constructors1) {
System.out.println(constructor);
}
获取类的Constructor>>>>>>>>>
public test.Dog()
获取类的DeclaredConstructor>>>>>>>>>
protected test.Dog(java.lang.String,int)
test.Dog(int)
private test.Dog(java.lang.String,int,int)
public test.Dog()
getConstructors返回该类中所有公共的构造方法。
getDeclaredConstructors返回该类中声明的所有构造方法,包括公共、保护、默认(包)访问和私有构造方法。
System.out.println("通过反射机制创建类的实例>>>>>>>>>");
System.out.println("1、调用类的Class对象的newInstance方法,该方法会调用对象的默认构造器,如果没有默认构造器,会调用失败.");
Class<?> dogClass = Dog.class;
Object o = dogClass.newInstance();
System.out.println(o);
System.out.println("2、调用默认Constructor对象的newInstance方法.");
Constructor<?> constructorclass = dogClass.getConstructor();
Object o1 = constructorclass.newInstance();
System.out.println(o1);
System.out.println("3、调用带参数Constructor对象的newInstance方法.");
Constructor<?> constructorclass2 = dogClass.getDeclaredConstructor(String.class, int.class);
Object o2 = constructorclass2.newInstance("poly", 10);
System.out.println(o2);
通过反射机制创建类的实例>>>>>>>>>
1、调用类的Class对象的newInstance方法,该方法会调用对象的默认构造器,如果没有默认构造器,会调用失败.
Dog [weight=0, name=null, age=0]
2、调用默认Constructor对象的newInstance方法.
Dog [weight=0, name=null, age=0]
3、调用带参数Constructor对象的newInstance方法.
Dog [weight=0, name=poly, age=10]
System.out.println("调用类的函数>>>>>>>>>");
Method method1 = dogClass.getMethod("getName");
System.out.println(method1.invoke(o2));
System.out.println("调用类的private函数>>>>>>>>>");
Method method2 = dogClass.getDeclaredMethod("bark");
method2.setAccessible(true);
method2.invoke(o2);
System.out.println("设置/获取类的属性值>>>>>>>>>");
Field age = dogClass.getField("age");
age.setInt(o, 8);
System.out.println(age.getInt(o));
调用类的函数>>>>>>>>>
poly
调用类的private函数>>>>>>>>>
wang wang wang...
设置/获取类的属性值>>>>>>>>>
8