反射机制详细讲解及实现

一、先来说一说什么是反射机制

        Java反射机制是指在运行状态中,动态获取信息以及动态调用对象方法的功能。

二、Java反射有三个动态性质

        运行时生成对象实例

        运行期间调用方法

        运行时更改属性

三、关键步骤如下

        使用反射获取类的信息

        使用反射创建对象

        使用反射访问属性和方法

四、反射常用的方法

        getDeclaredConstructors():        返回Class对象锁包含类的所有构造方法

        getDeclaredFields():                   返回此Class对象所包含类的的全部属性

        getInterfaces():                           返回该Class对象对应类所实现的全部接口

        getSuperclass():                         返回该Class所表示的父类对应的Class对象

        getDeclaredMethod                    返回该Class对象所包含的类的全部方法

        invote                                          执行对象方法

五、实现

举个简单的例子

public class TestReflect<T> {
   
    public static void main(String[] args) throws Exception{
//        1,获取类型Class
       Class<Student>sc =Student.class;
//     Student s=new Student();//由于s的类型不能确定具体的对象地址(可能是子类类型)所以用?
//     Class<? extends Student> sc1=s.getClass();//使用对象.getclass()
//        Class<?> sc2=Class.forName("cn.student");
        //2,获取构造方法,并且创造对象(上述所有获取类型的方法,最常用的是最后一个)
        Constructor<Student>c=sc.getDeclaredConstructor(int.class,double.class,String.class);//获取构造方法
        c.setAccessible(true);//强行获取访问权限
        Student s=c.newInstance(1,1.5,"王撕葱");//通过构造方法创建对象s
        System.out.println(s.getName());
        //3,使用对象构造方法
        Method method = sc.getDeclaredMethod("setStuNo", int.class);
        method.setAccessible(true);//强行获取权限
        Object o = method.invoke(s, 15);
        System.out.println(s);
        System.out.println(o);
        //4、使用对象强行对属性赋值(如果只有私有属性,没有方法)
        Field stuNo = sc.getDeclaredField("stuNo");//通过属性名获取
        stuNo.setAccessible(true);
        stuNo.set(s,18);
        System.out.println(s);
        //5,获取父类
        Class<? super Student> suc = sc.getSuperclass();//获取父类的Class对象
        Constructor<? super Student> cs = suc.getConstructor();//获取父类默认的构造方法
        Object object = cs.newInstance();
        System.out.println(object);
        Method think = suc.getMethod("think");
        think.invoke(object);
        //6,获取接口
        Class<?>[] i = sc.getInterfaces();
        Class<?> inter = i[0];//获取父接口
    }
}

子类

public class Student extends Human implements Talkable {
    public int stuNo;
    private double score;

    @Override
    public String toString() {
        return "Student{" +
                "stuNo=" + stuNo +
                ", score=" + score +
                '}';
    }

    private Student(){

   }

    public Student( int stuNo, double score) {

        this.stuNo = stuNo;
        this.score = score;
    }
    private Student( int stuNo, double score,String name) {
        setName(name);
        this.stuNo = stuNo;
        this.score = score;
    }

    private  int getStuNo() {
        return stuNo;
    }

   private void setStuNo(int stuNo) {
        this.stuNo = stuNo;
    }

    public double getScore() {
        return score;
    }

  public void setScore(double score) {
        this.score = score;
    }


}

父类

public class Human {
    public Human() {
    }

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Human(String name) {
        this.name = name;
    }
    public void think(){
        System.out.println("胡乱想");
    }
}
接口
package cn;

public interface Talkable {
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值