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);
}
public ReflectServiceImpl getInstance(){
ReflectServiceImpl object = null;
try {
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);
}
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, "张三");
} 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 = object.getClass().getMethod("sayHello", String.class);
method.invoke(object, "张三");
} catch (Exception e) {
e.printStackTrace();
}
return object;
}