1、java中的反射

理解class类

1、Class 对象只能由系统建立对象

2、一个类在 JVM 中只会有一个Class实例

3、每个类的实例都会记得自己是由哪个 Class 实例所生成

 

 

2、获取class对象的三种方法

1.通过类名获取      类名.class    

2.通过对象获取      对象名.getClass()

3.通过全类名获取    Class.forName(全类名)

 

 

3、class常用的几张方法

javase-----(13)反射和动态代理注意事项

 

 

4、ClassLoader

类装载器是用来把类(class)装载进 JVM 的。JVM 规范定义了两种类型的类装载器:启动类装载器(bootstrap)和用户自定义装载器(user-defined class loader)。 JVM在运行时会产生3个类加载器组成的初始化加载器层次结构 ,如下图所示:

javase-----(13)反射和动态代理注意事项

使用类加载器获取当前类目录下的文件

首先,系统类加载器可以加载当前项目src目录下面的所有类,如果文件也放在src下面,也可以用类加载器来加载调用 getResourceAsStream 获取类路径下的文件对应的输入流.

、public class ReflectionTest {

    @Test

    public void testClassLoader() throws FileNotFoundException{

        //src目录下,直接加载

        InputStream in1 = null;

        in1 = this.getClass().getClassLoader().getResourceAsStream("test1.txt");

 

        //放在内部文件夹,要写全路径

        InputStream in2 = null;

        in2 = this.getClass().getClassLoader().getResourceAsStream("com/atguigu/java/fanshe/test2.txt");

    }

}

 

 

 

5、反射的常用的几种方法(重要后面的spring的原理就是反射和动态代理)

1. Class: 是一个类; 一个描述类的类.

 封装了描述方法的 Method,

   描述字段的 Filed,

   描述构造器的 Constructor 等属性.
 
 2. 如何得到 Class 对象:
  2.1 Person.class
  2.2 person.getClass()
  2.3 Class.forName("com.atguigu.javase.Person")
  
 3. 关于 Method:
  3.1 如何获取 Method:
  1). getDeclaredMethods: 得到 Method 的数组.
  2). getDeclaredMethod(String methondName, Class ... parameterTypes)
  
  3.2 如何调用 Method
  1). 如果方法时 private 修饰的, 需要先调用 Method 的 setAccessible(true), 使其变为可访问
  2). method.invoke(obj, Object ... args);
  
  4. 关于 Field:
  4.1 如何获取 Field: getField(String fieldName)
  4.2 如何获取 Field 的值: 
  1). setAccessible(true)
  2). field.get(Object obj)
  4.3 如何设置 Field 的值:
  field.set(Obejct obj, Object val)
  
  5. 了解 Constructor 和 Annotation 
  
  6. 反射和泛型.
  6.1 getGenericSuperClass: 获取带泛型参数的父类, 返回值为: BaseDao<Employee, String>
  6.2 Type 的子接口: ParameterizedType
  6.3 可以调用 ParameterizedType 的 Type[] getActualTypeArguments() 获取泛型参数的数组.

 

 

 

 

6、java的反射

 

静态代理

1、写接口

javase-----(13)反射和动态代理注意事项

2、实现类

javase-----(13)反射和动态代理注意事项

3、代理类

javase-----(13)反射和动态代理注意事项

4、运行

javase-----(13)反射和动态代理注意事项

 

 

 

动态代理

1、接口

javase-----(13)反射和动态代理注意事项

2、实现类

javase-----(13)反射和动态代理注意事项

3、写实现InvocationHandler中有一个invoke方法,所有执行代理对象的方法都会被替换成执行invoke方法。

javase-----(13)反射和动态代理注意事项

4、运行

javase-----(13)反射和动态代理注意事项

相关文章:

  • 2019-06-17
  • 2021-11-05
  • 2021-12-29
  • 2018-12-04
  • 2021-11-18
  • 2018-12-11
  • 2021-08-05
  • 2020-03-24
猜你喜欢
  • 2018-10-08
  • 2019-05-16
  • 2019-01-23
  • 2019-12-16
  • 2018-04-12
  • 2021-11-02
  • 2018-07-30
  • 2021-09-07
相关资源
相似解决方案