java反射机制
##反射:框架设计的灵魂
框架:半成品软件。可以在框架的基础上及进行软件的开发,简化编码
反射:将类的各个组成部分封装为其他对象,这就是反射机制
好处:可以在程序运行过程中,操作这些对象。
可以解耦,提高程序的可扩展性。
java代码 在计算机中经历的三个阶段以及获取字节码Class对象的三种方式
第一阶段:person.class通过javac编译成person.class。可通过Class.forName(全路径类)获取对象的字节码
第二阶段:通过ClassLoader类加载器加载进JVM中,JVM方法区(用就区/Metaspace)存放类信息、常量、静态变量、即时编译器编译后的代码等数据
可通过 对象.class获取字节码对象
Class类对象阶段
成员变量 Field[] fields
构造方法 Constructor[] cons
成员方法 Method[] methods
第三阶段:创建对象,Runtine运行时阶段。Person对象new person();可通过person.getClass()获取字节码 对象
1 //第一种-》Class.forName(全类名)多用于配置文件,将类名定义在配置文件中,读取文件,加载类 2 Class clazz_p =Class.forName("com.zzff.reflect.Person"); 3 System.out.println(clazz_p);//class com.zzff.reflect.Person 4 5 //第二种-》类名.class通过类名的属性class获取,都用于参数的传递 6 Class clazz_c =Person.class; 7 System.out.println(clazz_c);//class com.zzff.reflect.Person 8 9 //第三种-》getClass方法在Object类中定义着,多用于对象的获取字节码的方式 10 Person person=new Person(); 11 Class<? extends Person> aClass = person.getClass(); 12 System.out.println(aClass);//class com.zzff.reflect.Person 13 14 //三种获取类字节码的方式地址比较 15 System.out.println(clazz_p==clazz_c);//true 16 System.out.println(clazz_p==aClass);//true 17 //得出的结论:同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次。对象都是同一个
常用方法:
1、获取成员变量
Field getField(String name) 获取指定名称的public修饰的成员变量
Field[] getFields() 获取public修饰的所有成员变量
Field getDeclaredField(String name) 获取指定名称的成员变量
Field[] getDeclaredFields() 获取所有成员变量
2、获取构造方法Constructor
类似上面
创建对象 *T newInstance(Object... initargs)
*如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance方法
3、获取成员方法Method
类似上面
执行方法: * Object invoke(Object obj,Object... args)
获取方法名称 * String getName()
4、获取类名
String getName();
参考案例
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 根目录下的配置文件reflect_frame.properties 2 className=com.zzff.reflect.Person,com.zzff.reflect.Student 3 method=eat,getSchool 4 5 public class Student { 6 7 public void getSchool(String str){ 8 System.out.println("Student在学校上学"+str); 9 } 10 public void eat(String str){ 11 System.out.println("Student在学校吃饭"+str); 12 } 13 } 14 15 16 public class Person { 17 18 19 public void eat(String str){ 20 System.out.println("person eat"+str); 21 } 22 public void doSomething(String str){ 23 System.out.println("person做"+str); 24 } 25 public void getSchool(String str){ 26 System.out.println("person在学校上学"+str); 27 } 28 } 29 30 31 32 33 public class TestFrame { 34 public static void main(String[] args) throws IOException, ClassNotFoundException, 35 IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException { 36 37 //读取配置文件内容 38 ClassLoader loader = TestFrame.class.getClassLoader(); 39 InputStream stream = loader.getResourceAsStream("reflect_frame.properties"); 40 Properties properties=new Properties(); 41 properties.load(stream); 42 String className= properties.getProperty("className"); 43 String[] name_strs = className.split(","); 44 String method = properties.getProperty("method"); 45 String[] method_strs = method.split(","); 46 //通过反射创建对象并且调用方法 47 for (String name_str : name_strs) { 48 Class<?> aClass = Class.forName(name_str); 49 Object instance = aClass.newInstance(); 50 for (String method_str : method_strs) { 51 Method declaredMethod = aClass.getDeclaredMethod(method_str,String.class); 52 if(declaredMethod!=null) 53 declaredMethod.invoke(instance,"怎么样"); 54 } 55 } 56 }
问题:什么是反射机制、反射机制在哪里使用、反射机制常用的接口有哪些