1. 概述
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
2. 反射机制初探
首先我们做一下准备工作:
package com.myreflex;
public class Demo {
private String str1;
public String str2;
private void fun1(){
System.out.println("You call fun1");
}
public void fun2(){
System.out.println("You call fun2");
}
public void fun3(int param1, String param2) {
System.out.println("You call fun3 with param:"+param1+" and "+param2);
}
public Demo(int param1, String param2) {
System.out.println("Consturctor with "+param1+","+param2);
}
public Demo() {
System.out.println("Consturctor with no param");
}
}
我们先创建一个测试类,其中包含了一个私有属性、一个公有属性、一个私有方法和一个公有方法。并为这个类准备了三个不同参数构方法。稍后我们要用到这个类。
(1)通过一个对象获取完整的包名和类名
package com.myreflex;
public class TestMain {
public static void main(String[] args) {
Demo demo = new Demo();
// 通过一个对象获取完整的包名和类名
System.out.println(demo.getClass().getName());
}
}
打印结果为: com.myreflex.Demo。
(2)实例化一个类
package com.myreflex;
public class TestMain {
public static void main(String[] args) {
Class<?> clazz;
Demo demo = null;
try {
clazz = Class.forName("com.myreflex.Demo");
demo = (Demo) clazz.newInstance(); //通过clazz.newInstance()来实例化Demo
} catch (InstantiationException e) {
} catch (IllegalAccessException e) {
} catch (ClassNotFoundException e1) {
}
demo.fun2();
}
}
打印结果为:
Consturctor with no param You call fun2
但是要注意:此种方法需要Demo拥有无参数的默认构造方法。
(3)获取类的属性
package com.myreflex;
import java.lang.reflect.Field;
public class TestMain {
public static void main(String[] args) {
Class<?> clazz;
try {
clazz = Class.forName("com.myreflex.Demo");
Field[] fields;
fields = clazz.getFields(); //获取类的所有属性(public)
System.out.println("--------------getFields----------------");
for (Field field : fields) {
System.out.println(field.getType().getName());
System.out.println(field.getName());
}
fields = clazz.getDeclaredFields(); //获取类的所有属性(public以及private)
System.out.println("--------------getDeclaredFields----------------");
for (Field field : fields) {
System.out.println(field.getType().getName());
System.out.println(field.getName());
}
} catch (Exception e) {
}
}
}
打印结果为:
--------------getFields---------------- java.lang.String str2 --------------getDeclaredFields---------------- java.lang.String str1 java.lang.String str2
(4)获取类的方法
package com.myreflex;
import java.lang.reflect.Method;
public class TestMain {
public static void main(String[] args) {
Class<?> clazz;
try {
clazz = Class.forName("com.myreflex.Demo");
Method[] methods;
methods = clazz.getMethods();
System.out.println("--------------getMethods----------------");
for (Method method : methods) {
System.out.println(method.getName());
}
methods = clazz.getDeclaredMethods();
System.out.println("--------------getDeclaredMethods----------------");
for (Method method : methods) {
System.out.println(method.getName());
}
} catch (Exception e) {
}
}
}
打印结果为:
--------------getMethods---------------- fun2 fun3 wait wait wait equals toString hashCode getClass notify notifyAll --------------getDeclaredMethods---------------- fun1 fun2 fun3
(5)获取方法的参数类型
package com.myreflex;
import java.lang.reflect.Method;
public class TestMain {
public static void main(String[] args) {
Class<?> clazz;
try {
clazz = Class.forName("com.myreflex.Demo");
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method.getName()+"方法的参数类型有:");
Class<?>[] paramClasses = method.getParameterTypes();
for (Class<?> paramClass : paramClasses) {
System.out.println(paramClass.getName());
}
}
} catch (Exception e) {
}
}
}
打印结果为:
fun1方法的参数类型有: fun2方法的参数类型有: fun3方法的参数类型有: int java.lang.String
(6)类方法的调用:
package com.myreflex;
import java.lang.reflect.Method;
public class TestMain {
public static void main(String[] args) {
Class<?> clazz;
try {
clazz = Class.forName("com.myreflex.Demo");
Method method2 = clazz.getDeclaredMethod("fun2"); // 获取fun2的方法
Method method3 = clazz.getDeclaredMethod("fun3", int.class, String.class); // 获取fun3的方法
Demo demo = (Demo) clazz.newInstance(); // 创建一个Demo的实例
method2.invoke(demo); // 执行fun2
method3.invoke(demo, 111, "aaa"); // 执行fun3
} catch (Exception e) {
}
}
}
(7)获取父类
package com.myreflex;
public class TestMain {
public static void main(String[] args) {
Class<?> clazz;
try {
clazz = Class.forName("com.myreflex.Demo");
clazz = clazz.getSuperclass();
System.out.println(clazz.getName());
} catch (Exception e) {
}
}
}
打印结果为:java.lang.Object。
(8)获取全部构造函数
package com.myreflex;
import java.lang.reflect.Constructor;
public class TestMain {
public static void main(String[] args) {
Class<?> clazz;
try {
clazz = Class.forName("com.myreflex.Demo");
Constructor<?>[] cons = clazz.getConstructors();
for (Constructor<?> constructor : cons) {
System.out.println(constructor);
}
} catch (Exception e) {
}
}
}
打印结果为:
public com.myreflex.Demo() public com.myreflex.Demo(int,java.lang.String)
(9)未完待续
…………………
来源:https://www.cnblogs.com/LOVE0612/p/5225552.html