类 Class  每个类被加载之后,系统就会为该类生成一个对应的Class对象,通过该Class对象就可以访问到JVM中的这个类. 我们在Java中获取Class对象一般有三种方式: (1), 使用Class类的forName(String className)静态方法.该方法需要传入字符串参数,该字符串参数的值是某个类的全限定类名(必须添加完整包名). (2), 调用某个类的class属性来获取该类对应的Class对象 例如,Person.class 将会返回Person类对应的class对象…
方法参数反射 Java8在java.lang.reflect包下新增了Executable抽象基类,该对象代表可执行的类成员,该类派生了Constructor和Method两个子类.Executable基类提供了大量方法来获取修饰该方法或构造器的注解信息:还提供了isVarArgs()用于判断该方法或构造器是否包含数量可变的形参,以及通过getModifiers()方法来获取该方法或构造器的修饰符.除此之外,Executable提供了如下两个方法来获取该方法或参数的形参个数及形参: int ge…
为什么我们使用动态代理 静态代理会让类变多了,多了代理类,工作量变大了,且不易扩展.比如我们上节课的例子,要实现不同的扩展方法就要编写不同的代理类,非常麻烦.   Proxy类的使用规则 Proxy提供了用于创建动态代理类和代理对象的静态方法,它也是所有动态代理类的父类.如果在程序中为一个或多个接口动态生成实现类,就可以使用 Proxy 来创建动态代理类.如果需要为一个或多个接口动态地创建实例,也可以使 Proxy 来创建动态代理实例. Proxy提供了如下两个方法来创建动态代理类和动态代理实例…
java.lang.reflect包下还提供了Array类 java.lang.reflect包下还提供了Array类,Array对象可以代表所有的数组.程序可以通过使 Array 来动态地创建数组,操作数组元素等. Array提供了如下几类方法: static Object newInstance(Class componentType, int... length): 创建一个具有指定的元素类型指定维度的新数组. static xxx getXxx(Object arr, int index…
生活中的代理 类(对象)代理模式 代理模式是面向对象编程中比较常见的设计模式. 1. 用户只关心接口功能,而不在乎谁提供了功能.上图中接口是 Subject 2. 接口真正实现者是上图的 RealSubject,但是它不与用户直接接触,而是通过代理. 3. 代理就是上图中的 Proxy,由于它实现了Subject接口,所以它能够直接与用户接触. 4. 用户调用 Proxy 的时候,Proxy 内部调用了 RealSubject.所以,Proxy 是中介者,它可以增强 RealSubject 操作…
首先先说一下类的加载,流程.只有明确了类这个对象的存在才可以更好的理解反射的原因,以及反射的机制. 一.  类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 加载 就是指将class文件读入内存,并为之创建一个Class对象--->  而这个对象就是我们反射中将要使用的对象. 任何类被使用时系统都会建立一个Class对象. 连接 验证  是否有正确的内部结构,并和其他类协调一致; 准备  负责为类的静态成员分配内存,并设置默…
using System; using System.Reflection; namespace ConsoleApp2 { class Program { static void Main(string[] args) { //反射获取 命名空间+类名 string className = "ConsoleApp2.ClassSample"; string methodName = "test1"; //传递参数 Object[] paras = new Obje…
新建一个Person类 package cn.tx.reflect; /** * 注解初步了解 * @author Administrator * */ public class Person { private Integer id; private String name; private String address; public Person() { super(); } public Person(Integer id, String name, String address) {…
反射可以解决在编译时无法预知对象和类是属于那个类的,要根据程序运行时的信息才能知道该对象和类的信息的问题. 在两个人协作开发时,你只要知道对方的类名就可以进行初步的开发了. 获取类对象 Class.forName(String clazzName)静态方法 调用类的class属性,Person.class返回的就是Person的class对象(推荐使用) 调用某个对象的getClass()方法 具体使用还是要根据实际来选择,第一种方式是比较自由的,只要知道一个类名就可以了,其不会做该类是否存在的…
引言 自从JDK5以后,Java Class类增加了泛型功能,从而允许使用泛型来限制Class类,例如,String.class的类型实际上是 Class 如果 Class 对应的类暂时未知,则使 Class<?>.通过在反射中使用泛型,可以避免使用反射生成的对象需要强制类型转换. 泛型作用对比: 如下示例没有使用泛型时,编译不报错,运行时报错强制转换异常 public class HasNoFanxin { public static Object newInstance(String cl…