Java反射技术应用普遍,它可以配置:类的全限定名、方法和参数,完成对象的初始化,甚至是反射某些方法。这样能够大大加强Java的可配置性,如Spring IoC 的基本原理也是反射,固然Spring IoC 的代码要复炸得多,还有其余的技术结合。java
Java 的反射内容繁多, 包括对象的构建、反射方法、注解、参数、接口等。此次主要讲一下对象的构建和反射的方法。在Java中,反射是经过包java.lang.reflect.* 来实现的。this
在Java中容许经过反射配置信息构造对象。spa
首先建立一个对象:code
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() 的方法来初始化一个对象。blog
若要构造带参的对象,能够查看如下代码:接口
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() 的方法来初始化一个对象。get
再上面咱们已经构造了对象,就能够调用他们的方法了,代码以下:io
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() 方法执行对应的方法,里面要写明对象和参数的值。经过这样就能够利用反射的方式去调用方法了。class
反射的优势:只要配置就能够生成对象,能够解除程序的耦合度,比较灵活,大大加强的可配置性和可扩展性。
反射的缺点:运行比较慢。