1. 设计模式———反射
1.1. Java反射技术
Java 反射技术应用广泛,他能够配置,类的全限定名、方法和参数,完成对象的初始化,甚至是反射某些方法。这样就可以大大增强了Java的可配置性,spring IOC 的基本原理也是如此
1.2. 通过反射构建对象
1.2.1. 反射创建无参实体类
1 public class ReflectServiceImpl { 2 3 public void sayHello(String name){ 4 System.err.println("hello" + name); 5 } 6 7 public static ReflectServiceImpl getInstance(){ 8 ReflectServiceImpl object = null; 9 try{ 10 object = (ReflectServiceImpl) Class.forName("com.lean.ssm.chater2.reflect.ReflectServiceImpl").newInstance(); 11 }catch(Exception e){ 12 e.printStackTrace(); 13 } 14 return object; 15 } 16 }
关注的重点
Class.forName("com.lean.ssm.chater2.reflect.ReflectServiceImpl").newInstance();
1.2.2. 一个 成员变量的实体类
1 public class ReflectServiceImpl2 { 2 3 private String name; 4 5 public ReflectServiceImpl2(String name) { 6 super(); 7 this.name = name; 8 } 9 10 // 带构造方法的hello 11 public void sayHello(){ 12 System.out.println("hello " + name); 13 } 14 15 public static ReflectServiceImpl2 getInstance(String name){ 16 ReflectServiceImpl2 object = null; 17 18 // 进行反射 19 try { 20 object = (ReflectServiceImpl2) Class.forName("com.lean.ssm.chater2.reflect.ReflectServiceImpl2").getConstructor(String.class).newInstance(name); 21 } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException 22 | NoSuchMethodException | SecurityException | ClassNotFoundException e) { 23 // TODO Auto-generated catch block 24 e.printStackTrace(); 25 } 26 27 return object; 28 } 29 }
添加了成员变量
注意:Class.forName("com.lean.ssm.chater2.reflect.ReflectServiceImpl2").getConstructor(String.class).newInstance(name);
getConstructor(Class<?>...) 是可变参数:参数的类型的 .class
多个成员变变量(伪代码)
object = (ReflectServiceImpl3) Class.forName("com.lean.ssm.chater2.reflect.ReflectServiceImpl3").getConstructor(String.class,int.class).newInstance(name, age);
红色内容表示参数类型。绿色表示的是 参数的数值
1.1. 通过反射构建 方法
方法的反射,表明已经有对象。进行方法的反射;
方法包括的参数 ;没有参数。一个参数。多个参数;三种情况
public class ReflectMethod { // 无参数 ,无返回值 public void sayHello(){ System.out.println("hello"); } // 无参数,有返回值 public String returnHello(){ return "hello"; } // 一个参数,有返回值 public int addOne(int num) { // 输入的数字加上 1 return num + 1; } // 多个参数,有返回值 public int plusNun(int x,int y){ return x + y; } }
反射的代码
在使用反射方法前要获取方法对象,得到了方法才能够去反射。
public class ReflectMethodTest { // 使用反射方法前,先获取反射对象 ReflectMethod reflectMethod = new ReflectMethod(); // 无参数 无返回值 @Test public void test1() throws Exception { Method method = reflectMethod.getClass().getDeclaredMethod("sayHello", null); method.invoke(reflectMethod, null); } // 一个参数,有返回值 @Test public void test2() throws Exception { Method method = reflectMethod.getClass().getDeclaredMethod("addOne", int.class); Object invoke = method.invoke(reflectMethod, 25); System.out.println(invoke); } // 多个参数 @Test public void test3() throws Exception { Method method = reflectMethod.getClass().getDeclaredMethod("plusNun", int.class,int.class); Object invoke = method.invoke(reflectMethod, 25,3); System.out.println(invoke); } }
方法的反射,表明已经有对象。进行方法的反射;
方法包括的参数 ;没有参数。一个参数。多个参数;三种情况