java反射

本文深入解析Java反射机制,包括其工作原理、应用优势及如何通过类名创建对象、调用方法和属性。涵盖反射获取类字节码的三种方式,以及通过代码示例展示如何使用反射访问类的构造函数、属性和方法。

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

一.什么是java反射
能通过一个类的名称创建这个类的对象,并且使用类中的方法和属性

二.为什么会有发射?使用反射有什么好处?
1.降低程序的耦合程度
2.用作框架:用框架是需要读取配置文件,通过配置文件,读取要用到的类的名称,然后通过反射得到他的方法,
为什么框架要用反射呢?因为框架设计者不知道你在用这个框架的时候用到什么jar包,什么类,所以要用到反射
下图是XML中的jar包配置
xml中的配置

三.获取类的字节码
有三种方法:
1.Class<?> aClass = Class.forName(“reflection.Factory”);
2.Class stringClass = String.class;
3.Class<? extends String> aClass1 = new String().getClass();

可以通过字节码,创建一个这个类的对象

四.上代码

package reflection;

public class Factory {

    public String sa = "adjahd";

    private Factory reflection;

    private int i = 3;

    public Factory(){
        System.out.println("Factory");
    }

    public Factory(String s){
        System.out.println(s);
    }

    private Factory(int i2){
        System.out.println(i2);
    }

    public static IBaoCaiMing getZhengxiongzhang(){
        return new ZhengXiongZhang();
    }

    public static IBaoCaiMing getZhengyanggao(){
        return new ZhengYangGao();
    }

    public void prient(){
        System.out.println("这是方法");
    }

    private String gest(String saa){
        System.out.println(saa);
        return "我是返回值";
    }

}

package reflection;

import org.junit.Test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ClassDome {

    @Test
    public void test1() throws Exception{

        //加载类 得到的是类的字节码 三种方式
        Class<?> aClass = Class.forName("reflection.Factory");
        Class<String> stringClass = String.class;
        Class<? extends String> aClass1 = new String().getClass();

        System.out.println("--------------------构造函数----------------------");
        //获取类的public构造函数,创建出对象
        Constructor constructor = aClass.getConstructor(String.class);
        Factory aa = (Factory) constructor.newInstance("jasfhja");
        //获取类的private的构造函数,
        Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(int.class);
        declaredConstructor.setAccessible(true);//暴力访问
        Factory o = (Factory) declaredConstructor.newInstance(3);
        //只适用于无参的构造函数
        Factory o1 = (Factory) aClass.newInstance();

        System.out.println("--------------------属性----------------------");
        //获取类的public属性
        Field sa = aClass.getField("sa");
        Object field = sa.get(o);
        System.out.println(field);
        //获取类的private的属性
        Field reflection = aClass.getDeclaredField("reflection");
        reflection.setAccessible(true);
        Factory field1 = (Factory) reflection.get(o);
        System.out.println(field1);   //这只是引用并没有赋值
        reflection.set(o,new Factory());  //给reflection属性赋值

        System.out.println("--------------------方法----------------------");
        //获取类的public方法
        Method prient = aClass.getMethod("prient", null);
        prient.invoke(o,null);   //参数是一个对象 和 可变参数
        //获取类的private方法、并获取返回值
        Method gest = aClass.getDeclaredMethod("gest", String.class);
        gest.setAccessible(true);
        String mes = (String) gest.invoke(o, "mes");
        System.out.println(mes);

    }

}

运行结果

--------------------构造函数----------------------
jasfhja
3
Factory
--------------------属性----------------------
adjahd
null
Factory
--------------------方法----------------------
这是方法
mes
我是返回值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值