反射机制详解

本文深入讲解Java反射机制的概念、应用场景及API使用方法,并通过实例演示如何利用反射机制将类信息转换为JSON格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  一.java反射概念

JAVA反射机制是在运行状态中,  对于任意一个类,都能够知道这个类的所有属性和方法;
                                                   对于任意一个对象,都能够调用它的任意一个方法和属性;
                                                   这种动态获取信息以及动态调用对象的方法的功能称为java语言的反射机制。
反射的作用:    动态的获取类中的信息

 在运行过程中,  也就是我们的类在硬盘上存储着,在运行的时候加载到内存中, 会为我们Class类的对象,  来表示Car类的信息,  其中可以提供多种方法来访问Car中的信息

二.为什么使用反射机制

 之前我们创建对象都是通过最简单的  new Car();的方式来创建
  1. 先定义一个类  Car
  2. 后创建对象,使用对象
       这是正常的使用,已知某个类,创建该类的对象.  正向使用.  但是这种写法,把代码直接写死了,不能变了,固定了
   而框架需要为我们处理不同的类,我们配置什么类,它都需要能够创建,new这种方式显然是不能满足的,所以我们引入反射机制为框架提供更好的应用环境

三.java反射API

Java反射相关的类主要包括
1.Class 类型
2.Constructor 构造方法
3.Method 方法
4. Field 属性
 除了Class外,其他类都位于java.lang.reflect包中
可见,反射API将类的类型、方法、属性都封装成了类,其中最重要的类是
Class,可以说,反射的使用都是从Class开始,Class类是反射的基础

四.三种获得类的Class类的方法

Class c1 = User.class;
  System.out.println(c1);

Class c2 = new User().getClass();
        System.out.println(c2);

Class c3 = Class.forName("com.ffyc.javareflect.model.User");
//这里可以随意传入任意类
注意: 反射的起点就是获得该类的class对象,在通过class对象,获取类的信息
无论类创建了多少个当对象,该类的class对象只有一个

1.获得Constructor类实例

String forname ="com.ffyc.javareflect.model.User";
Class c1 = Class.forName(forname);
Object b = c1.newInstance();//class类中c1.newInstance();   也是创建对象的一种方式

(1)获取类中公共指定的构造方法,用Constructor类的对象来表示获取方法的信息

Constructor constructor = c1.getConstructor();
        Object b1 = constructor.newInstance();
 Constructor constructor1 = c1.getConstructor(int.class,String.class,String.class);
                    constructor1.getParameters();//获取参数类型

(2)获取类中指定的构造方法(包含私有的)

Constructor constructor2 = c1.getDeclaredConstructor(int.class,String.class,String.class);
                    constructor2.setAccessible(true);//开启权限
                    constructor2.newInstance(1,"jim","123");

(3)获取所有的构造方法

 Constructor[] constructor3 = c1.getDeclaredConstructors();
2.获得Field实例,获得Method实例
String forname ="com.ffyc.javareflect.model.User";
Class c = Class.forName(forname);
Object b = c.newInstance();
 //获取类中所有的属性
        Field[] field = c.getDeclaredFields();
        for (Field field1 : field){//一个field代表当前循环到该对象的一个属性
            //field1.getName();//获取属性的名字
            //field1.setAccessible(true);//开启权限
            //field1.set(b,111);//给属性赋值
            //通过反射机制获得类中的方法
            String name = "set"+ field1.getName().substring(0,1).toUpperCase()+field1.getName().substring(1);//获取set方法
            Method method = c.getMethod(name,field1.getType());
            method.invoke(b,1111);
        }

我们一般给类中的属性赋值都是通过get,   set  方法,通过拼接字符串得到set方法的名字,从而获得对应的属性的set方法给属性赋值

Method类的作用:

Method类将类中的方法进行封装,可以动态获得方法的信息,例如
getName:获得方法名字
getParameterTypes:获得方法参数类型
除了动态获得方法信息外,Method还能动态调用某一个对象的具体方法
invoke(Object obj, Object... args) :使用obj调用该方法,参数为args

五.反射案例(转json)

public class Myjson {
    public static String tojson(Object obj) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Class c = obj.getClass();
        String json = "{";
        Field[] fields = c.getDeclaredFields();
        for (Field field : fields){
            String name = field.getName();
            json+=name+":";
            Method method = c.getMethod("get"+ name.substring(0,1).toUpperCase()+name.substring(1));
            Object value = method.invoke(obj);
            json+=value+",";
        }
        json=json.substring(0,json.length()-1);
        json+="}";
        return json;
    }

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException {
        User user = new User();
        user.setAccount("admin");
        user.setPassword("111");
        System.out.println( tojson(user));
    }
}

这样我们传入任意的类,都会将类中的信息转为json格式


六.反射的优缺点

1.优点

1.增加程序的灵活性,可以在运行的过程中动态对类进行修改和操作

2.提高代码的复用率,比如动态代理
3.可以在运行时轻松获取任意一个类的方法、属性,并且还能通过反射进行动态调用
2.缺点
1.反射会涉及到动态类型的解析,导致性能要比非反射调用更低
2.使用反射技术通常要在一个没有安全限制的程序运行.
3.反射可以绕过一些限制访问的属性或者方法,可能会导致破坏代码本身的抽象性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值