Java反射

反射:

1、可以在程序运行过程中,操作这些对象。

2、可以解耦,提高程序的可扩展性。

反射类:

package zhujie;

public class cau {
    public int a;
    public double b;
    private String c;

    @Override
    public String toString() {
        return "cau{" +
                "a=" + a +
                ", b=" + b +
                ", c='" + c + '\'' +
                '}';
    }

    public cau(int a,double b,String c){
        this.a=a;
        this.b=b;
        this.c=c;
    }
    public cau(){}
    private cau(int a){}

    public void add(int a,int b){
        System.out.println(a + b);
    }

    private void max(){
        System.out.println(1 * 2);
    }

    public void min(){
        System.out.println(1 / 0);
    }
}
获取Class对象的方式:

1、Class.forName(“全类名”):将字节码文件加载进内存,返回Class对象。

        多用于配置文件,将类名定义在配置文件中。读取文件,加载类。

2、类名.class:通过类名的属性class获取

        多用于参数的传递。

3、对象.getClass():getClass()方法在Object类中定义。

        多用于对象的获取字节码的方式。

结论:同一个字节码文件(*.class)在一次文件运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个。

public void reflect() throws Exception {
        //Class.forName(“全类名”)
        Class aClass1 = Class.forName("zhujie.cau");
        System.out.println(aClass1);
        //类名.class
        Class cauClass = cau.class;
        System.out.println(cauClass);
        //对象.getClass()
        cau cau = new cau();
        Class aClass = cau.getClass();
        
        System.out.println(aClass);
        System.out.println(cauClass == cauClass);
        System.out.println(aClass1 == cauClass);
    }
Class对象功能:

1、获取成员变量们

        Field[] getFields():获取所有公有的成员变量

        Field getField(String name):获取公有的指定成员变量

        Filed[] getDeclaredFields():获取所有的成员变量(包括私有)

        Field getDeclaredFields(String name):获取指定成员变量(包括私有)

Field[] fields = aClass.getDeclaredFields();
Field a = aClass.getField("a");

2、获取的构造方法们

        Constructor<?>[] getConstructors():获取所有公有的构造函数

        Constructor<T> getConstructor(<?>...parameterTypes(参数类型)):获取公有的指定构造函数

        Constructor<?>[] getDeclaredConstructors():获取所有的构造函数(包括私有)

        Constructor<T> getDeclaredConstructor(parameterTypes):获取指定构造函数(包括私有)

Constructor[] constructors = aClass.getConstructors();
System.out.println(constructors);
Constructor constructor = aClass.getConstructor(int.class, double.class, String.class);
System.out.println(constructor);

3、获取成员方法

        Method[] getMethods():获取所有公有的成员方法

        Method getMethod(String name,<?>... parameterTypes):获取公有的指定成员方法

        Method[] getDeclaredMethods():获取所有的成员方法(包括私有)

        Method getDeclaredMethod(String name,​​​​​​​<?>... parameterTypes):获取指定成员方法(包括私有)

Method method=aClass.getMethod("add",int.class,int.class);
Method[] methods = aClass.getMethods();
methods[0].invoke(cau,1,2);
System.out.println(method.getName());

4、获取类名

        String getName()

Field:成员变量

1、设置值

        void set(Object obj,Object value)(类的对象,修改值)

2、获取值

        ​​​​​​​Object get(Object obj)(对象)

3、忽略访问权限修饰符的安全检查(当通过set或者get获取或者修改pirvate的值时,会报错)

        setAccessible(true):暴力反射

a.set(cau,3);
//fields[2]为private变量
System.out.println(fields[2].isAccessible());
fields[2].setAccessible(true);
fields[2].set(cau,"fd");
System.out.println(fields[2].get(cau));
Constructor:构造方法

1、创建对象

        ​​​​​​​T newInstance(Object... initargs)(参数)

        如果使用空参数构造方法创建对象,操作可以简化:Class.newInstance();

Object o1 = aClass.newInstance();
Object o = constructor.newInstance(1,2,"ewr");
System.out.println(o);
System.out.println(o1);
Method:方法对象

1、执行方法

​​​​​​​​​​​​​​        Object invoke(Object obj, Object... args)(类的对象,参数)

2、获取方法名称

        String getName()

  • 14
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值