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();

参考案例

 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     }
View Code

问题:什么是反射机制、反射机制在哪里使用、反射机制常用的接口有哪些

 

 

 

posted @ 2021-06-04 20:16  ffzzblog  阅读(42)  评论(0编辑  收藏  举报