1.1 Java反射技术

本文介绍了Java反射机制,包括如何通过反射构建无参和有参构造函数的对象,以及如何调用方法。通过反射,可以在运行时动态创建对象并执行相应的方法,降低了代码的耦合度,但也存在性能损耗的问题。示例展示了使用Class.forName和Method.invoke方法的具体操作。
摘要由CSDN通过智能技术生成

1.1 Java反射技术

   Java的反射包括对象构建、反射方法、注解、参数、接口等,反射通过 java.lang.reflect.*实现的

1.1.1 通过反射构建对象

   无参构造函数的类
   //通过类加载器注册了一个ReflectServiceImpl类的全限定类名,然后通过newInstance()初始化了一个对象
   object = (ReflectServiceImpl)Class.forName("com.ssm.chapter2.reflect.ReflectServiceImpl").newInstance();
package com.ssm.chapter2.reflect;

public class ReflectServiceImpl {
    public void sayHello(String name){
        System.out.println("Hello" + name);
    }

    /**
     * 通过反射构建ReflectServiceImpl对象(不含任何参数)
     */
    public ReflectServiceImpl getInstance(){
        ReflectServiceImpl object = null;
        try {
            //通过类加载器注册了一个ReflectServiceImpl类的全限定类名,然后通过newInstance()初始化了一个对象
            object = (ReflectServiceImpl)Class.forName("com.ssm.chapter2.reflect.ReflectServiceImpl").newInstance();
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
        }
        return object;
    }
}
   有参构造函数的类
   1、先通过 forName 加载到类的加载器
   2、通过 getConstructor() 方法,其参数可以为多个
   3、用 newInstance() 方法生成对象,但要写上实际参数的值
   object = (ReflectServiceImpl2)Class.forName("com.ssm.chapter2.reflect.ReflectServiceImpl2").getConstructor(String.class).newInstance("张三");
package com.ssm.chapter2.reflect;

public class ReflectServiceImpl2 {
    private String name;

    public ReflectServiceImpl2(String name) {
        this.name = name;
    }

    public void sayHello(){
        System.out.println("Hello" + name);
    }

    /**
     * 通过反射构建ReflectServiceImpl对象(有参构造函数)
     */
    public ReflectServiceImpl2 getInstance(){
        ReflectServiceImpl2 object = null;
        try {
            object = (ReflectServiceImpl2)Class.forName("com.ssm.chapter2.reflect.ReflectServiceImpl2").getConstructor(String.class).newInstance("张三");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return object;
    }
}
  反射的优点:只要配置就可以生成对象,可以接触程序的耦合度
  反射的缺点:运行比较慢

1.1.2 反射方法

	1、Method method = ReflectServiceImpl.class.getMethod("sayHello", String.class);
		第一个参数为 方法名称,第二个参数为参数的类型
	2、method.invoke(target, "张三");
		target:确定用哪个对象调用方法
		"张三"是参数,等同于target.sayHello("张三"); 参数可以是多个
    /**
     * 反射方法
     */
    public Object reflectMethod(){
        Object object = null;
        ReflectServiceImpl target = new ReflectServiceImpl();
        try {
            Method method = ReflectServiceImpl.class.getMethod("sayHello", String.class);
            return method.invoke(target, "张三");  //返回类型为Object
        } catch (Exception e) {
            e.printStackTrace();
        }
        return object;
    }

1.1.3 实例

	通过实例来反射生成对象和反射调度方法
	/**
     * 反射生成对象和反射调度方法
     */
    public Object reflect(){
        ReflectServiceImpl object = null;
        try {
            //反射构建对象
            object = (ReflectServiceImpl)Class.forName("com.ssm.chapter2.reflect.ReflectServiceImpl").newInstance();
            //方法对象 method
            Method method = object.getClass().getMethod("sayHello", String.class);
            method.invoke(object, "张三");
        } catch (Exception e) {
            e.printStackTrace();
        }
            return object;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值