java反射常用API小结

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和源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值