JavaSE-09之反射

反射

Java反射机制:是指在运行时取获取一个类的变量和方法信息,然后通过获取到的信息来创建对象,调用方法的一种机制,由于这种动态性,可以极大的增强程序的灵活性,程序不用在编译期酒完成确定,在运行期仍然可以扩展。

获取class类的对象

要想通过反射取使用一个类,首先要获取到该类的字节码文件对象,也就是类型为Class类型的对象,这里我们提供三种方式:

使用类的class属性来获取该类对应的class对象,举例:Student。Class将会返回Student类对应的class对象,

调用对象的getClass()方法,返回该对象所属类对应的class对象

该方法是object类中的方法,所有的Java对象都可以调用该方法

使用Class类中的静态方法forname(String className):该方法需要传入字符串参数,该字符串参数的值是某个类的全路径,也就是完整包名的路径。

public class persontest {
   
public static void main(String[] args) throws ClassNotFoundException {


       
//三中获取class对象的方式
       
//1 通过class.foename("全类名来获取")
       
Class cls1 = Class.forName("junit.person");
       
//2中通过类名。class方式
       
Class cls2 = person.class;
       
//3种方式
       
person p1 = new person();
       
Class cls3 = p1.getClass();
       
System.out.println(cls3);
       
System.out.println(cls2);
       
System.out.println(cls1);

    }
}

反射重点:

反射是框架设计的灵魂

框架:半成品软件,可以在框架的基础上进行软件开发,简化编程

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

好处:可以在程序运行过程中,操作这些对象,

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

7;;获取class对象的方式:3种方式

Class,for Name

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

类名.class

多用于参数的传递

对象。Getclass();

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

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

package junit;

public class persontest {
   
public static void main(String[] args) throws ClassNotFoundException {


       
//三中获取class对象的方式
       
//1 通过class.foename("全类名来获取")
       
Class cls1 = Class.forName("junit.person");
       
//2中通过类名。class方式
       
Class cls2 = person.class;
       
//3种方式
       
person p1 = new person();
       
Class cls3 = p1.getClass();
       
System.out.println(cls3);
       
System.out.println(cls2);
       
System.out.println(cls1);

    }
}

反射获取构造方法并使用

Constructor<?>[] getConstructors():返回所有公共构造方法对象数组

Constructor<?>[] getDeclaredConstructors():返回所有构造方法对象数组

Constructor<T>[] getConstructors(Class<?>,,,,parameterTypes):返回单个公共构造方法对象

Constructor<T>[] getDeclaredConstructor(Class<?>,,,,parameterTypes):返回单个构造方法对象数

    //获取所有public修饰的构造方法
        Constructor[] constructors = c.getConstructors();
        for(Constructor constructor:constructors){
            System.out.println(constructor);
        }

        //获取所有构造方法
        Constructor[] declaredConstructors = c.getDeclaredConstructors();
        for(Constructor declaredConstructor:declaredConstructors){
            System.out.println(declaredConstructor);
        }
 //获取带参构造函数对象
        Constructor con1 = c.getDeclaredConstructor(String.class,int.class,String.class);
        //通过带参构造函数对象
        Object obj1 =  con1.newInstance("林青霞",23,"北京");
        System.out.println(obj1);
 

反射获取成员变量并使用

Field[] getFields():返回所有公共成员变量对象的数组

Field【】getDeclaredFields();返回所有成员变量对象的数组

Field[] getField(String name):返回单个公共成员变量对象

Field【】getDeclaredFields(String);返回单个成员变量对象

成员变量反射练习

Constructor con = c.getConstructor();
        Object obj = con.newInstance();
        System.out.println(obj);
  Field addressField = c.getField("address");
        // 给obj对象的addressField 字段设置值为"北京"
        addressField.set(obj, "北京");
        System.out.println(obj);

反射获取成员方法并使用

Method[] getMethods():返回所有公共成员方法对象的数组,包括继承的

Method[]getDeclarerdmethods();返回所有成员对象的数组,不包括继承的

MethodgetMethod(String name,Class<?>…parameterTypes):返回单个公共成员方法对象

Method getDeclarerdmethod(String name, Class<?>…parameterTypes);返回单个成员对象

Method m2 = c.getMethod("method", String.class);
        m2.invoke(obj, "你好");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值