编程语言java反射-java
xiu概念
反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构
实例化对象–>getClass()–>完整的类
反射就是操作Class对象
获取class对象的三种方式
一个加载的类在 JVM 中只会有一个Class实例,通过Class可以完整地得到一个类中的所有被加载的结构
1 2 3 4 5 6 7 8 9 10 11 12 13
| import test.Student; public class Test { public static void main(String[] args) throws ClassNotFoundException {
Class<?> s1 = Class.forName("test.Student");
Class<Student> s2 = Student.class;
Student student = new Student(); Class<?> s3 = student.getClass();
} }
|
Class对象的作用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| import test.Student;
import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method;
public class Test { public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
Class<Student> s2 = Student.class;
Constructor studentConstructor = s2.getConstructor(String.class,char.class,int.class); Student student1 = (Student) studentConstructor.newInstance("xiu", 'M', 18); System.out.println(student1);
Field[] s1DeclaredFields = s2.getDeclaredFields(); for (Field s1DeclaredField : s1DeclaredFields) { System.out.println(s1DeclaredField); }
Method[] s1declaredMethods = s2.getDeclaredMethods(); for (Method s2m : s1declaredMethods) { System.out.println(s2m); }
Method act1 = s2.getDeclaredMethod("action", String.class); act1.invoke(student1,"xiuxiuxiu");
} }
|