1、Java 反射技术
Java反射技术应用广泛,它能够配置:类的全限定名、方法和参数,完成对象的初始化,甚至是反射某些方法。这样可以大大增强Java的可配置性,如Spring IoC 的基本原理也是反射,当然Spring IoC 的代码要复炸得多,还有其他的技术结合。
Java 的反射内容繁多, 包括对象的构建、反射方法、注解、参数、接口等。这次主要讲一下对象的构建和反射的方法。在Java中,反射是通过包java.lang.reflect.* 来实现的。
2、通过反射构建对象
在Java中允许通过反射配置信息构造对象。
首先创建一个对象:
- package com.hhh.learn.reflect;
- /**
- * 对象
- * @author chao
- *
- */
- public class ReflectServiceImpl {
-
- private String name;
-
- //不带参的构造方法
- public ReflectServiceImpl(){}
-
- //带参构造方法
- public ReflectServiceImpl(String name){
- this.name = name;
- }
-
- public void sayHello(String name){
- System.out.println("Hello!" + name);
- }
-
- public void sayHello(){
- System.out.println("Hello!" + name);
- }
- }
然后通过反射方法去构造这个对象,如下代码:
- //不带参
- public ReflectServiceImpl getInstance(){
- ReflectServiceImpl object = null;
- try{
- object = (ReflectServiceImpl) Class.forName("com.hhh.learn.reflect.ReflectServiceImpl").newInstance();
- }catch(Exception e){
- e.printStackTrace();
- }
- return object;
- }
这里的代码就可以利用反射去构造了一个 ReflectServiceImpl 对象。其实利用反射方法构造对象就是给类加载器注册了一个类的全限定名,再通过 newInstance() 的方法来初始化一个对象。
若要构造带参的对象,可以查看以下代码:
- public ReflectServiceImpl getInstance2(){
- ReflectServiceImpl object = null;
- try{
- object = (ReflectServiceImpl) Class.forName("com.hhh.learn.reflect.ReflectServiceImpl").getConstructor(String.class).newInstance("张三");
- }catch(Exception e){
- e.printStackTrace();
- }
- return object;
- }
先通过 forName()的方法将类加载到加载器中,再通过 getConstructor()方法选择哪一个构造方法,最后通过 newInstance() 的方法来初始化一个对象。
3、反射方法
再上面我们已经构造了对象,就可以调用他们的方法了,代码如下:
- ReflectServiceImpl object = null;
- try{
- object = (ReflectServiceImpl) Class.forName("com.hhh.learn.reflect.ReflectServiceImpl").newInstance();
- Method method = object.getClass().getMethod("sayHello", String.class);
- method.invoke(object, "李四");
- }catch(Exception e){
- e.printStackTrace();
- }
对象构造好,通过 getClass() 的方法获取对应的对象, 再通过 getMethod()方法获取对应的方法,里面填调用的方法名和参数的类型, 最后就调用 invoke() 方法执行对应的方法,里面要写明对象和参数的值。通过这样就可以利用反射的方式去调用方法了。
4、反射的优点和缺点
反射的优点:只要配置就可以生成对象,可以解除程序的耦合度,比较灵活,大大增强的可配置性和可扩展性。
反射的缺点:运行比较慢。