Class类与Java反射
概述
Java反射机制是在运行状态中,对任意一个类,都能知道这个类的所有属性和方法;对于任意一个对象,都能调用它的任意方法和属性,这种动态获取的信息以及动态调用对象方法的功能称为Java语言的反射机制。可以在程序中访问已经装载到JVM中的java对象的描述,实现访问、检测和修改描述Java对象本身的信息的功能。
Java的java.lang.reflect包提供了对反射的支持。
Class类
类也是对象,它是java.lang.Class类的实例对象;
Class类的实例表示正在运行的Java应用程序中的类和接口,它没有公共构造犯法。要创建该类的对象,有以下三种方法:
定义一个测试类Person
package ReflectDemo;
public class Person {
private String name;
private String city;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", city='" + city + '\'' +
", age=" + age +
'}';
}
}
//使用类的class属性
Class<Person> pc1 = Person.class;
System.out.println("第一种:"+pc1.hashCode());
//使用Class类的forName方法
try {
Class<?> pc2 = Class.forName("ReflectDemo.Person");
System.out.println("第二种:"+pc2.hashCode());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//使用Object对象的getClass方法
Person person = new Person();
Class<? extends Person> pc3 = person.getClass();
System.out.println("第三种:"+pc3.hashCode());
获取构造方法
getConstructors()
:返回一个包含某些Constructor对象的数组,这些对象反映此Class对象所表示的所有公共构造方法。getConstructor(Class<?> parameterTypes)
:返回一个Constructor对象,它反映此Class对象所表示的类的指定公共构造方法。getDeclaredConstuctor()
:返回Constructor对象的一个数组,这些对象反映此Class对象表示的类声明的所有构造方法;getDeclaredConstructor(Class<?> parameterTypes)
:返回一个Constructor对象,它反映此Class对象所表示的类或接口的指定构造方法。
如果是访问指定的构造方法,需要根据该构造方法的入口参数的类型来访问。
操作构造方法的方法:
-
isVarArgs()
:查看该构造方法是否允许带有可变数量的参数; -
getParameterType()
:按照声明顺序以Class数组的形式获得该构造方法的各个参数的类型; -
getExceptionTypes()
:以Class数组的形式获得该构造方法可能抛出的异常类型; -
newInstance(Object initargs)
:通过该构造方法利用指定参数创建一个该类的对象,如果未设置参数则表示默认方法; -
setAccessible(Boolean flag)
:如果该构造方法的权限为private,默认不允许通过反射利用newInstance方法创建对象,如果先执行该方法,并将入口参数设为true,则允许创建。 -
getModifiers()
:获得可以解析出该构造方法所采用修饰符的整数;
通过java.lang.reflect.Modifier类可以解析getModifiers()方法的返回值所表示的修饰符信息;
isPublic(int mod)
:查看是否被public修饰符修饰
其他修饰符判断方法同上;toString(int mod)
:以字符串形式返回所有修饰符;
获取成员变量
getFields()
:返回一个包含某些Fileld对象的数组,这些对象反映此Class对象所表示的类或接口的所有可访问公共字段;getField(String name)
:返回一个Field对象,它反映此Class对象所表示的类或接口的指定公共成员字段;
对于成员变量和构造方法一样也有:
getDeclareFields()
:返回一个Field对象的数组,包含Class对象所表示的类或接口声明的所有字段;getDeclareFields(String name):
返回一个Field对象,该对象反映此Class对象所表示的类或接口指定已声明字段;
对获取到的成员变量操作:
getName()
:获取该成员的名称;getType()
:获取该成员变量类型的Class对象;get(Object obj)
:获得指定对象obj中成员变量的值;set(Object obj,Object value)
:将指定对象obj中成员变量的值设置为value;getXxx(Object obj)
:获得指定对象obj中类型为Xxx的成员变量的值;setAccessible(boolean flag)
:此方法可以设置是否忽略权限限制直接访问private等私有权限的成员变量。getModifires()
:获得可以解析出该成员变量所采用的修饰符的整数;
获取方法
getMethods()
:返回一个包含某些Method对象的数组,这些对象反映此Class对象所表示的类或接口的公共成员方法;
getMethod(Class<?> parameterTypes)
:返回一个Method对象,它反映此Class对象所表示的类的指定公共成员方法。getDeclaredMethods()
:返回Method对象的一个数组,这些对象反映此Class对象表示的类声明的所有方法;getDeclaredMethods(Class<?> parameterTypes)
:返回一个Method对象,它反映此Class对象所表示的类或接口的指定成员方法。
操作获取到的成员方法:
getName()
:获得该方法的名称;getParameterTypes()
按照声明顺序以Class数组的形式获得该方法的各个参数的类型;getReturnType()
:以Class对象的形式获得该方法的返回值的类型;getExceptionTypes()
:以Class数组的形式获得该方法可能抛出的异常类型;invoke(Object obj,Object ...args)
:利用指定参数args执行指定对象obj中的该方法,返回值类型为Object;isVarArgs()
:查看该构造方法是否允许带有可变数量的参数;getModifires()
:获得可以解析出该方法所采用的修饰符的整数;
Annotation注解
概述
Annotation是java.lang包下的一个接口,它是代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理,它可以用于类、构造方法、成员变量、方法、参数等的声明中。分为内置注解和自定义注解两种。
内置注解
- @Override:限定重写父类方法;
- @Deprecated:标示已过时;
- @SuppressWarnings:抑制编译器警告;
自定义注解
使用自定义注解主要分为三个步骤:
- 自定义注解;
- 使用元注解对自定义注解进行设置;
- 反射注解;
1.自定义注解
关键字@interface,这个关键字的隐含意思是继承了java.lang.annotation.Annotation接口;