JAVA反射

1 篇文章 0 订阅
本文详细介绍了Java反射机制的用途,包括在编译时未知类信息的情况下创建对象和执行操作。通过反射,可以访问私有成员并调用私有方法。文中提供了一个示例代码,展示了如何使用反射创建对象、调用构造函数、执行无参和有参方法,以及调用私有方法的过程。反射虽然功能强大,但同时也存在代码复杂、安全性降低和性能下降的缺点。
摘要由CSDN通过智能技术生成

反射

  1. 若编译时已经知道了类或对象的具体信息,那么直接对类和对象进行操作即可,不需要使用反射。

  2. 若编译时不知道类或对象的具体信息,运行的时候才知道,这种情况就不知道要new哪个类具体执行哪些操作,此时需要反射。

作用:在不能用new等一些基础操作时可以利用反射来进行创建对象、操作属性、执行方法。

优点:

  1. 编译时不知道类或者对象的具体信息,运行时才知道,创建对象无法使用new方法,但是反射可以完成对象创建。

  2. 可以突破封装性的限制,即使是private的成员也可以进行访问。

缺点:

  1. 代码繁琐,可读性差,速度较慢。

  2. 打破了封装性,可能有安全隐患。

使用反射创造对象

//需要创建对象的类
package com.meng.reflection;
​
public class Reflection {
    public Reflection() {
        System.out.println("公有构造函数");
    }
    private Reflection(String name){
        System.out.println("私有构造函数");
    }
    public int nameid;
    public String name;
    private int id;
​
    public int getNameid() {
        return nameid;
    }
​
    public String getName() {
        return name;
    }
​
    public void setNameid(int nameid) {
        this.nameid = nameid;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public void met1(){
        System.out.println("无参数方法");
    }
​
    public int  met2(int a, int b){
        return a + b;
    }
​
    private int met3(int a,int b){
        return a - b;
    }
}
​
​
package com.meng.reflection;
​
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
​
public class RefCons {
    public static void main(String[] args) throws Exception{
        //通过反射进行公有构造函数的调用创建对象
        Class aClass = Class.forName("com.meng.reflection.Reflection");
        Constructor constructor = aClass.getConstructor();
        Object o = constructor.newInstance();
​
        //通过反射进行私有构造函数的调用创建对象
        Constructor declaredConstructor = aClass.getDeclaredConstructor(String.class);//获得私有构造函数的结构,仅这一部只是获得结构并不能进行调用
        declaredConstructor.setAccessible(true);//调用私有构造函数
        Object xiaoming = declaredConstructor.newInstance("xiaoming");
​
        //通过反射调用无参方法
        Method met1 = aClass.getMethod("met1");
        met1.invoke(xiaoming);
​
        //通过反射调用有参方法
        Method met2 = aClass.getMethod("met2", int.class, int.class);
        Object sum =  met2.invoke(xiaoming,10,20);
        System.out.println(sum);
​
        //通过反射调用私有方法
        Method met3 = aClass.getDeclaredMethod("met3", int.class, int.class);
        met3.setAccessible(true);
        Object invoke = met3.invoke(xiaoming, 10, 5);
        System.out.println(invoke);
​
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值