java 反射注解有什么用_java 反射和注解

java反射

1. 什么是反射

反射 (Reflection) 是 Java 的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。

Oracle 官方对反射的解释是:

Reflection enables Java code to discover information about the fields, methods and constructors of loaded classes, and to use reflected fields, methods, and constructors to operate on their underlying counterparts, within security restrictions.

The API accommodates applications that need access to either the public members of a target object (based on its runtime class) or the members declared by a given class. It also allows programs to suppress default reflective access control.

简而言之,就是在java运行期可以通过反射来获取类的成员或者成员的信息(字段,方法,构造器等)。程序中一般对象的类型都确定下来了,而通过反射机制可以动态的创建对象,并且去调用它的属性,即使这样的对象在编译时期是未知的。

java反射机制的核心就是jvm在运行时去创建对象或调用方法/访问属性,它不需要事先知道(写代码或者编译期)对象是谁

java反射的主要功能:

在运行时判断任意一个对象所属的类

在运行时构建任意一个类的对象

在运行时判断任意一个类所具有的变量和方法(通过反射甚至可以调用private方法)

在运行时调用任意一个对象的方法

反编译 .class -> .java

反射主要涉及的类

java.lang .class

java.lang.reflect.field

java.lang.reflect.method

java.lang.reflect.modifier

java.lang.reflect.constructor

2. Class

2.1 什么是Class对象

实际上java的每个类被编译成.class文件的时候,java虚拟机(叫jvm)会自动为这个类生成一个类对象,这个对象保存了这个类的所有信息(成员变量,方法,构造器等),以后这个类要想实例化(也就是创建类的实例或创建类的对象)那么都要以这个class对象为蓝图(或模版)来创建这个类的实例。例如 class> c=Class.forName("com.pojo.User"); c就是User的类对象,而 User u=new User();这个u就是以c为模版创建的,其实就相当于u=c.newInstance(); 这个在java的反射里面讲的比较清楚。

2.2 创建Class对象的三种方式

public static void main(String[] args) throws Exception{

//创建Class对象的三种方式

//c1 c2 c3引用保存内存地址指向堆中的对象,该对象代表的是 employee 整个类

//1.使用 Class.forName("全类名")

Class> c1 = Class.forName("com.iandf.Employee");

//2.每个类型都有 class 属性

Class> c2 = Employee.class;

//3.先获取对象,通过对象过去 class

Employee e = new Employee();

Class> c3 = e.getClass();

System.out.println(c1 == c2);

System.out.println(c2 == c3);

}

测试结果都为true

Class.forName("com.iandf.Employee");对导致类加载,类的静态代码块会执行

2.3 使用Class对象创建实例

@Test

public void newInstanceByReflect() throws Exception{

//通过反射创建对象实例

Class> c1 = Class.forName("com.iandf.bean.Employee");

//使用class对象创建实例,默认调用无参构造方法,如果没有无参构造方法就会报InstantiationException

Object o = c1.newInstance();

System.out.println(o);

}

2.4 加载配置文件创建对象

通过配置文件创建对象,无需再运行期知道对象是谁,在编译期可以动态的创建对象,更加灵活

@Test

public void newInstanceByFile() throws Exception{

InputStream in = new FileInputStream("src\\com\\iandf\\reflect.properties");

Properties properties = new Properties();

properties.load(in);

String className = properties.getProperty("className");

Class> c1 = Class.forName(className);

Object o = c1.newInstance();

System.out.println(o);

}

NOTE:文件路径问题

getResource 默认是从类路径开始的,所以文件必须放在类路径src下

//使用当前线程的类加载器加载资源文件,这个方法可以得到文件的绝对路径,比上一个获取文件路径的方法灵活,以后代码移植更加方便

String filePath = Thread.currentThread().getContextClassLoader().getResource("com/iandf/reflect.properties").getPath();

System.out.println(filePath);

//也可以直接获取文件的流

InputStream inputStream = Thread.cu

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值