Java学习——反射机制

1.什么是反射机制?

简单来说,就是可以操作字节码文件,意思就是程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。

本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象的各种信息

2.反射机制的作用? 

在运行时获得类的各种内容,进行反编译,对于Java这种先编译再运行的语言,能够让我们很方便的创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代码的链接,更加容易实现面向对象

1.通过反射机制访问java对象的属性,方法,构造方法等

2.反射最重要的用途就是开发各种通用框架。比如很多框架(Spring)都是配置化的(比如通过XML文件配置Bean),为了保证框架的通用性,他们可能需要根据配置文件加载不同的类或者对象,调用不同的方法,这个时候就必须使用到反射了,运行时动态加载需要的加载的对象

3.反射机制相关的类在哪个包下?

java.lang.reflect.*

4.反射机制相关的主要的类?

java.lang.Class

java.lang.reflect.Method;

java.lang.reflect.Constructor;

java.lang.reflect.Field;

5.在java中获取Class的三种方式

(1)Object-->getClass

(2)任何数据类型(包括基本的数据类型)都有一个“静态”的class属性

(3)通过class类的静态方法:forName(String className)(最常用)

//第一种方式获取Class对象  
   Class c = int.class;

   Class c = String.class;

//第二种方式获取Class对象

   Class c = 对象.getClass;

//第三种方式获取Class对象

   Class c = class.forName("完整类名");

注意,在运行期间,一个类,只有一个Class对象产生

6.获取了Class之后,可以调用无参数构造方法来实例化对象

Class c = Class.forName("java.lang.Date");

Object obj = c.newInstance();

        一定要注意:

                newInstance()底层调用的是该类型的无参构造方法,如果没有这个无参数构造方会出现”实例化异常"。

7.如果你只想让一个类的"静态代码块"执行的话

用Class.forName("该类的类名”);//执行时,类会加载

这样类就加载,类加载的时候,静态代码块执行!!!!!

8.关于获取文件的绝对路径(在任何系统下都适用)

String path = Thread.currentThread().getContextClassLoader().

                       getResource("写文件的相对路径,但必须在src下").getPath();

String path = Thread.currentThread().getContextClassLoader().

                       getResource("abc").getPath();//必须保证src下面有abc文件

String path = Thread.currentThread().getContextClassLoader().

                       getResource("abc/db").getPath();//必须保证src下面有abc目录,abc目录下有db文件

但是该文件要求放在类路径下,换句话说,也就是放到src下面。

9.关于利用 IO+Properties   拿类名的操作

 //通过IO流读取文件
        try {
            FileReader file = new FileReader("Remake_10.31\\classinfo.properties");

            //创建属性类对象Map
            //Properties可以保存到流中或从流中加载。 属性列表中的每个键及其对应的值都是一个字符串
            Properties pr = new Properties();
            pr.load(file);//load(Reader reader)  参数必须是Reader对象
            //关闭流,已经通过load 将流里面的数据加载到pr中了,所以流可以关闭了
            file.close();

            //通过key获取value
            String classname = pr.getProperty("classname");
            System.out.println(classname);//即可以通过读配置文件,拿到了类名

运行结果,成功拿到了类名

 

 10.除了上上面那种利用IO +Properties的方法, 还可以利用资源绑定器 快速绑定属性资源文件。但有以下两个要求 1.这个文件必须在src下 2.这个文件必须以.properties结尾。

/*资源绑定器*/
/*只能用于xxx.properties属性配置文件,并且这个文件必须放下类路径下*/
public class ResourceBundleDemo {
    public static void main(String[] args) {
        ResourceBundle resourceBundle = ResourceBundle.getBundle("db");

        //io +properties步骤
        //reader
        //Properties p = new Properties();
        //p.load();
        //以上这几步都不需要了
        //记住这种方法就行了

        String classname = resourceBundle.getString("classname");
        System.out.println(classname);
    }
}

运行结果: 

 

 

db.properties在src路径下 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值