框架的灵魂——反射(一)

框架:半成品软件,再框架上开发,简化编码

(reflect)反射:将类的各个组成部分封装为其他对象,这就是反射机制

反射前提是:需要获取字节码文件再进行操作

 

成员变量,构造方法,成员方法

好处:

         1程序运行过程中,操作这些对象

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

获取字节码对象的三种方式:

         1class.forName(“全类名”):将字节码文件加载进内存,返回Class对象(多用于配置文件,将类名定义在配置文件中。读取文件,加载类)

         2类名.class:通过类名的属性class获取  (多用于参数的传递)

         3对象.getClass()  (多用于对象的获取字节码的方式)

package cn.homework.reflect;


import cn.homework.domain.Person;
//练习获取Class字节码的方法
public class ReflectDemo1 {
    public static void main(String[]args) throws ClassNotFoundException {
        Class  a = Person.class;//1.类名.class
        Class  a1 = Class.forName("cn.homework.domain.Person");//2.Class.forName("全类名")
        Person p = new Person();
        Class  a2=p.getClass();//对象名.getClass
        System.out.println(a==a1);
        System.out.println(a==a2);
    }
}

Class对象的功能

获取功能:

1获取成员变量们

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

FieldgetField(String name)   获取指定名称的 public修饰的成员变量

Field[]getDeclaredFields()  获取所有的成员变量,不考虑修饰符

FieldgetDeclaredField(String name)  private和其他权限的

package cn.homework.reflect;
 

import cn.homework.domain.Person;
import java.lang.reflect.Field;
//练习获取成员变量ieldF
public class ReflectDemo2 {
    public static void main(String[]args) throws Exception{
        //获取Class对象
        Class personClass = Class.forName("cn.homework.domain.Person");
        //Filed[] getFileds()获取所有public修饰的成员变量
        Field[] fields = personClass.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }

        System.out.println("==================");
        //Field getField(String name) 获取指定成员变量的值
        Field a = personClass.getField("a");
        Person p = new Person();
        //a在p对象上的值
        Object o = a.get(p);//Objectget(Object obj) 返回由该Field表示的字段在指定对象上的值。
        //修改a在p对象上的值
        a.set(p,"ao");
        System.out.println(o);
        System.out.println("======================");
        //Field[] getDeclaredFields():获取所有的成员变量,不考虑修饰符
        Field[] declaredFields = personClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }
        System.out.println("===================");
        //Field getDeclaredField(String name)获取private修饰的变量
        Field d = personClass.getDeclaredField("d");
        //忽略访问权限符的安全检查
        d.setAccessible(true);//暴力反射
        Object o1 = d.get(p);//只有经过暴力反射的私有成员变量,才可以操作
        System.out.println(o1);
    }
}

2获取构造方法们

 Constructor<?>[] getConstructors() 

  Constructor<T> getConstructor(类<?>... parameterTypes) 

 Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)  涉及到private时候需要用暴力反射

 Constructor<?>[]getDeclaredConstructors() 

package cn.homework.reflect;


import cn.homework.domain.Person;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class ReflectDemo3 {
    public static void main(String[]args) throws Exception{
        //获取Person的Class对象
        Class personClass = Person.class;
        //Constructor<T> getConstructor(Class<?>...parameterTypes)
        Constructor constructor =personClass.getConstructor(String.class, int.class);
        System.out.println(constructor);
        //创建对象(用获取到的构造方法)
        Object person = constructor.newInstance("矫健的步伐", 23);
        System.out.println(person);
        System.out.println("==================");
        //创建对象(用获取到的类对象)
        Object o = personClass.newInstance();
        System.out.println(o);


    }
}

3获取成员方法们

         Method[] getMethods() 

  Method getMethod(String name, 类<?>... parameterTypes) 

 Method[] getDeclaredMethods() 

         Method getDeclaredMethod(String name, 类<?>... parameterTypes) 

package cn.homework.reflect;
 

import cn.homework.domain.Person;
import java.lang.reflect.Method;
//获取成员方法们 Method
public class ReflectDemo4{
    public static void main(String[]args) throws Exception {
    //获取Person的Class对象
     Class personClass = Person.class;
     //获取指定名称的方法Method[] getMethod(String name,Class<?>...parameterTypes)
        Method eat = personClass.getMethod("eat");
        Person p = new Person();
        //执行方法invoke(Object obj, Object... args)
        // obj - 从底层方法被调用的对象
        //args - 用于方法调用的参数
        // 在具有指定参数的指定对象上调用此方法对象表示的基础方法
        eat.invoke(p);

        Method eat1 = personClass.getMethod("eat", String.class);
        //执行方法
        eat1.invoke(p,"土");
        System.out.println("==================");

        //获取所有public修饰的方法
        Method[] methods = personClass.getMethods();
        for (Method method : methods) {
            System.out.println(method);
            String name = method.getName();
            System.out.println(name);
        }
        System.out.println("================");

        //获取类名
        String name = personClass.getName();
        System.out.println(name);


    }
}

4获取类名

         String getName() 

 

更多java技术性文章请扫描二维码关注下面公众号,每天都有技术更新哦!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hbpartty

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值