java反射API
前言
本篇博客不设计反射的原理及其过程,主要是教会大家使用java反射常用的API
,能够在日常编码中使用到它。
相信我,这么多种类型总有一种会被用到
正文
测试实例
//一个用于本次反射的实例类
package demo;
/**
* @version V1.0
* @Title:
* @Package
* @Description:
* @author: 刘星星
* @date: 2020/3/5 20:23
*/
public class ReflctResouce {
// String 类型属性
public String name;
// int 类型属性
private anInt;
// 静态类型
public static Character character;
// 无参构造器方法
public ReflctResouce(){ }
// 有参构造器方法
public ReflctResouce(String name, int anInt) {
this.name = name;
this.anInt = anInt;
}
// 具有返回值的方法
public String getName() {
return name;
}
// 无返回值但是具有参数的方法
public void setName(String name) {
this.name = name;
}
// 模拟普通方法
public void activeone(){
System.out.println("模拟无参无返回的功能");
}
// 模拟只有含参的方法
public void activeone(int a){
System.out.println("模拟无参无返回的功能" + a);
}
// 模拟只有返回值的方法
public int activetwo(){
System.out.println("模拟有参有返回的功能");
return 111111;
}
// 模拟私有方法
private void activethree(){
System.out.println("模拟私有方法");
}
// 模拟静态普通方法
public static void activestatic(){
System.out.println("模拟拟静态普通方法");
}
}
一、通过反射创建对象
注意:
反射只能反射已存在的类,无法反射还未定义的类
// 获取类的全称 包名+类名
Class reflctClass = Class.forName("demo.ReflctResouce");
// 反射对象| getConstructors是返回所有的构造方法| newInstance是创建实例的方法 参数为动态参数
Object obj = reflctClass.getConstructors()[0].newInstance();
// 开始反射 放入全称
Class reflctClass = Class.forName("demo.ReflctResouce");
// 反射对象
String name = "haha";
int anInt = 12;
// getConstructor是根据 class参数类型获取对应的构造器
Constructor constructor = reflctClass.getConstructor(name.getClass(), int.class);
Object obj = constructor.newInstance("haha", 12);
//下面是强转测试 是否属性被注入
ReflctResouce reflctResouce = (ReflctResouce) obj;
System.out.println(reflctResouce.name+" "+reflctResouce.anInt);
二、通过反射访问对象的属性
// 开始反射 放入全称
Class reflctClass = Class.forName("demo.ReflctResouce");
// 反射对象
Object obj = reflctClass.getConstructors()[0].newInstance();
// 获得字段
Field field = reflctClass.getField("name");
//给对象设置 类对象| 值
field.set(obj, "haha");
System.out.println(field.get(obj));
// 开始反射 放入全称
Class reflctClass = Class.forName("demo.ReflctResouce");
// 反射对象
Object obj = reflctClass.getConstructors()[0].newInstance();
//反射获取私有变量 getDeclaredField
Field field = reflctClass.getDeclaredField("anInt");
// 允许私有变量被访问
field.setAccessible(true);
field.set(obj, 12);
System.out.println(field.get(obj));
三、通过反射调用方法
// 开始反射 放入全称
Class reflctClass = Class.forName("demo.ReflctResouce");
// 反射静态方法
Method method = reflctClass.getMethod("activestatic");
// 方法的调用 null指的是调用此方法对象,由于是静态不需要对象使用null即可
method.invoke(null);
// 开始反射 放入全称
Class reflctClass = Class.forName("demo.ReflctResouce");
// 反射对象
Object obj = reflctClass.getConstructors()[0].newInstance();
Method method = reflctClass.getMethod("activeone", int.class);
method.invoke(obj,1);
// 开始反射 放入全称
Class reflctClass = Class.forName("demo.ReflctResouce");
// 反射对象
Object obj = reflctClass.getConstructors()[0].newInstance();
Method method = reflctClass.getMethod("activetwo");
Object num = method.invoke(obj);
System.out.println(num);
// 开始反射 放入全称
Class reflctClass = Class.forName("demo.ReflctResouce");
// 反射对象
Object obj = reflctClass.getConstructors()[0].newInstance();
Method method = reflctClass.getDeclaredMethod("activethree");
method.setAccessible(true);
method.invoke(obj);
后记
本篇博客仅作字典查询使用,想真正了解反射使用反射跟厉害的功能。大家还是去专门看官方API和源码