反射的介绍与使用
程序员文章站
2024-01-25 19:53:16
...
目录
一、反射
1.1什么是反射?
java在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
1.2作用
在日常的第三方应用开发过程中,经常会遇到某个类的某个成员变量,方法或者是属性是私有的或是只对系统应用开放,这时候就可以利用java的反射机制通过反射来获取所需的私有成员或是方法。
1.3反射机制的相关类
Class类 代表类的实体,在运行的java应用程序中表示类的接口 File 类 代表类的成员变量(成员变量也称为类的属性) Method类 代表类的方法 Constructor 类 代表类的构造方法
1.4Class类
Class类代表类的实体,在运行的java应用程序中表示类和接口。在这个类中提供了很多有用的方法来操作一个类的实体
方法 用途
- asSubclass(Class clazz) 把传递的类的对象转换成代表其子类的对象
- Cast 把对象转换成代表类或是接口的对象
- getClassLoader() 获得类的加载器
- getClasses() 返回一个数组,数组中包含该类中所有公共类和接口类的对象 getDeclaredClasses() 返回一个数组,数组中包含该类中所有类和接口类的对象
- forName(String className) 根据类名返回类的对象
- getName() 获得类的完整路径名字
- newInstance() 创建类的实例
- getPackage() 获得类的包
- getSimpleName() 获得类的名字
- getSuperclass() 获得当前类继承的父类的名字 getInterfaces() 获得当前类实现的类或是接口
1.5获得类中属性相关的方法
1.5.1获得类中相关属性的方法
- getFiled(String name) 获得某个共有的属性对象
- getFileds() 获得所有公有的属性对象 (返回一个数组)
- getDeclared() 获得某个属性对象(可以是公有的,也可以是私有的) getDeclaredFileds() 获得所有的属性对象( 返回一个数组)
1.5.2获得类中的注解相关方法
- getAnnotation(Class annotationClass) 返回该类中与参数类型匹配的公有注解对象
- getAnnotations() 返回该类中所有的注解对象
- getDeclaredAnnotation(ClassannotationClass) 返回该类中与参数类型匹配的所有注解对 象
- getDeclaredAnnotations() 返回该类中所有的注解对象
1.5.3获得类中构造器的相关方法
- getConstructor(Calss<?>paramerterTypes) 获得该类中与参数类型相匹配的公有构造方法
- getDeclaredConstructors() 获得该类的所有公有构造方法
- getDeclaredConstructor(Class...<?> parameterTypes) 获得该类中与参数类型匹配的构造方法 getDeclaredConstructors() 获得该类所有构造方法
1.5.4获得类中方法相关的方法
- getMthod(String name,Classparameter) 获得该类的某个共有方法 getMethods() 获得所有该类的公有方法
- getDeclaredMethod(String name,ClassparameterTypes) 获得该类的某个方法 getDeclaredMethods() 获得该类的所有方法
1.5.5类中其他重要的方法
- isAnnotation() 如果是注解类型则返回true
- isAnnotationPresent(Class<? extends Annotation> annotationClass) 如果是指定类型注解类型则返回true
- isAnonymousClass() 如果是匿名类则返回true
- isArray() 如果是一个数组类则返回true
- isEnum() 如果是枚举类则返回true
- isInstance(Object obj) 如果obj是该类的实例则返回true
- isInterface() 如果是接口类则返回true
- isLocalClass() 如果是局部类则返回true
- isMemberClass() 如果是内部类则返回true
1.6Filed类
Field代表类的成员变量(成员变量也称为类的属性)。
方法 用途
- equals(Object obj) 属性与obj相等则返回true
- get(Object obj) 获得obj中对应的属性值
- set(Object obj, Object value) 设置obj中对应属性值
class App{
private static Object Integer;
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
//获得该类的Class类对象
Class<?> aClass = Class.forName("反射.Text01");
//通过参数类型来匹配来返回一个该类的构造类对象
Constructor<?> constructor = aClass.getConstructor(Integer.class);
//第一种实例化方式:通过构造类的对象来实例化该类
Text01 o = (Text01) constructor.newInstance(3);
//第二中实例化方式 Text01 o = (Text01) aclass..newInstance();
//获得指定的属性(可以是公有,也可以是私有)
Field i = aClass.getDeclaredField("i");
//通过调用setAccessible()方法可修改该类的可见性,true代表可以修改;
i.setAccessible(true);
//get(Object object) 获得该属性的值
System.out.println(i.get(o));
//set(Object object) 设置获得属性值
i.set(o,8);
System.out.println(i.get(o));
}
}
//得到类中的所有属性,返回已发个数组
class App{
private static Object Integer;
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
Class<?> aClass = Class.forName("反射.Text01");
//实例化一个类对象
Object o = aClass.newInstance();
//得到所有的属性返回一个Filed[]数组
Field[] fields = aClass.getDeclaredFields();
//遍历fields数组
for (Field file:fields){
//设置获得属性的可见度
file.setAccessible(true);
//得到属性的名称
System.out.println(file.getName());
if(file.getName().equals("a")){
file.set(o,5);
}
}
for (Field field:fields){
System.out.println(field.get(o));
}
}
}
//结果:a
a b c d 5 2 3 4
//结果:a a b c d 5 2 3 4
1.7Method类
invoke(Object obj, Object... args) 传递object对象及参数调用该对象对应的方法
@Data
public class Text01 {
private Integer a=1;
private Integer b=2;
private Integer c=3;
private Integer d=4;
public Text01() {
System.out.println("构造方法");
}
public void show(int a){
System.out.println("来吧,展示");
}
public void show1(int a){
System.out.println("hello world");
}
}
class App{
private static Object Integer;
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
Class<?> aClass = Class.forName("反射.Text01");
//实例化一个类对象
Object o = aClass.newInstance();
//得到所有的属性返回一个Method类型的数组
Method[] methods = aClass.getDeclaredMethods();
for (Method method:methods){
if(method.getName().substring(0,4).equals("show"))
method.invoke(o,3);
}
}
}
上一篇: Java实训日志4
下一篇: 理解反射(二)成员变量的反射