反射机制的初步入门

反射的机制:

传统调用对象的方法,采用new方法将对象实例化,用对象实例化进行调用:

package org.example;

public class Main {
    public static void main(String[] args) {
        //传统调用对象的方法,采用new一个对象实例化,然后调用其方法
        //下面是传统方法的例子
        Cat cat=new Cat();
        cat.method();
    }
}
package org.example;

public class Cat {
    public void method(){
        System.out.println("猫吃鱼");
    }
}

虽然简洁明了方便,但是不满足设计模式23项原则中的开闭原则(不修改原代码的基础上扩展功能)

体现了反射的重要性

反射的作用:

       反射通过配置文件来达到不需要修改原代码的基础上,扩展功能,具体表现为对于任何一个类,都可以获得这个类的属性和方法,对于给定的一个对象,都能调用它的任意一个属性和方法,动态的获取类的内容以及动态的调用对象的方法,称之为反射机制

下面是一个简单的例子:

package org.example;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Properties;

public class Main {
    public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        //通过properties类可以读取配置文件的内容
        Properties properties=new Properties();
        //将需要读取的文件以文件流方式传入
        properties.load(Files.newInputStream(Paths.get("src\\main\\resources\\re.properties")));
        //获取相应的类
        String classPath=properties.get("classPath").toString();
        //获取相应的对象名
        String methodName=properties.get("method").toString();
        //使用反射机制解决
        //第一步加载一个类
        Class<?> aClass = Class.forName(classPath);
        //类实列化
        Object o = aClass.newInstance();
        //在反射机制中一切皆对象,通过class加载一个方法对象
        Method method1 = aClass.getMethod(methodName);
        //通过方法对象实现调用方法
        method1.invoke(o);//传统中是对象.方法,在反射机制中,方法.invoke(对象)

    }
}

在此实例中如果想对cat类进行更新迭代,产生其他的方法运用在这里,只需要将cat继承,实现想要的功能,然后更改配置文件的路径,符合设计模式的开闭原则

 反射原理:

 1.反射机制允许程序在执行期借助于reflection Api取得任何类的内部信息(比如成员变量,成员方法,构造器等等),并能操作对象的属性及方法,反射在设计模式的底层框架都会用到

2.加载完类之后,在堆中产生了一个class类型的对象(一个类只有一个class对象),这个对象包含了类的完整结构信息。

 编译阶段在java的jvm机制中操作

反射相关类: 

 class (class代表一个类,class对象表示某个类加载后在堆中的对象)      field (表示类的成员变量)  method(表示类的成员方法) constructor(代表类的构造器)  

反射的优缺点: 

优点:可以动态的创建和使用对象(也是框架底层的核心),使用灵活,没有反射机制,框架技术就失去底层支撑

缺点:使用反射的基本是解释执行,对执行速度有影响。

使用反射的耗时:

 使用new创建对象的耗时:

 

由此可见反射的性能更低

反射调优:

1.Method和Field、Constructor对象都有setAccessible0方法
2.setAccessible作用是启动和禁用访问安全检查的开关
3.参数值为tue表示反射的对象在使用时取消访问检查,
提高反射的效率。参数值为false则表示反射的对象执行访问检查

将反射的访问检测关闭,可以适当的优化:

没优化的耗时:

优化的耗时:

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值