更新时间:2021年03月18日 08时58分24秒 来源:黑马程序员论坛
java反射构建对象和方法的反射调用 Java反射技术应用广泛,其能够配置:类的全限定名,方法和参数,完成对象的初始化,设置是反射某些方法。可以增强java的可配置性。 1.1 通过反射构建对象(无参数): 例如我们使用 ReflectServiceImpl 类讲解这个例子 1 public class ReflectServiceImpl { 2 public void sayHello(String name){ 3 System.out.println("hello"+name); 4 } 5 } 我们通过反射的方法去构建它。 复制代码 1 public ReflectServiceImpl getInstance(){ 2 ReflectServiceImpl object=null; 3 try { 4 object=(ReflectServiceImpl)Class.forName("com.lean.ssm.chapter2.reflect.ReflectServiceImpl").newInstance(); 5 } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { 6 e.printStackTrace(); 7 } 8 return object; 9 } 复制代码 其中第4行:object=(ReflectServiceImpl)Class.forName("com.lean.ssm.chapter2.reflect.ReflectServiceImpl").newInstance(); 是给类加载器注册一个类ReflectServiceImpl的权限定名,之后通过newInstance方法初始化一个类对象。 1.2 通过反射构建对象(类的构造器中带有参数): 我们使用ReflectServiceImpl2这个类去理解: 复制代码 1 public class ReflectServiceImpl2 { 2 private String name; 3 public ReflectServiceImpl2(String name) { 4 this.name=name; 5 } 6 public void sayHello(String name){ 7 System.out.println("hello"+name); 8 } 9 } 复制代码 此时 ReflectServiceImpl2的构造器带有参数 public ReflectServiceImpl2(String name){xxxx}; 此时我们该如何利用反射生成对象呢?只需要在类加载器注册的使用getConstructor(参数)方法。其中参数是我们构造器中的参数的类型。代码如下: 复制代码 1 public ReflectServiceImpl2 getInstance(){ 2 ReflectServiceImpl2 object=null; 3 try { 4 object=(ReflectServiceImpl2)Class.forName("com.lean.ssm.chapter2.reflect.ReflectServiceImpl2") 5 .getConstructor(String.class).newInstance("张三"); 6 } catch (InstantiationException | IllegalAccessException | ClassNotFoundException | InvocationTargetException |NoSuchMethodException e) { 7 e.printStackTrace(); 8 } 9 return object; 10 } 复制代码 如4、5行所示: 先通过forName加载到类的加载器。然后通过getConstructor方法,它的参数可以是多个,这里定义String.class,意为有且只有一个参数类型为String 的构建方法。通过这个方法可以对重名方法进行排除,此时再用newInstance方法生成对象,只是newInstance方法也多了一个参数“张三”而已。实际上就等于object=new ReflectServiceImpl2("张三").只是利用了反射来生成对象而已。 1.3 反射方法 在使用反射方法之前需要先获取对象,得到了方法才能够去反射。 我们使用 ReflectServiceImpl 类为例。 ReflectServiceImpl 类代码: 1 public class ReflectServiceImpl { 2 public void sayHello(String name){ 3 System.out.println("hello"+name); 4 } 5 } 调用方法: 复制代码 1 public Object reflect(){ 2 ReflectServiceImpl object=null; 3 Object returnObj=null; 4 //反射生成对象 5 try { 6 object = (ReflectServiceImpl) Class.forName("com.lean.ssm.chapter2.reflect.ReflectServiceImpl").newInstance(); 7 //反射生成方法并调度 8 Method method = object.getClass().getMethod("sayHello", String.class); 9 returnObj= method.invoke(object, "张三"); 10 }catch( ClassNotFoundException| NoSuchMethodException| InvocationTargetException| IllegalAccessException| InstantiationException e ) { 11 e.printStackTrace(); 12 } 13 return returnObj; 14 } 复制代码 当有具体对象 object(类型为ReflectServiceImpl),而不知道具体是哪个类的时候,也可以使用object.getClass().getMethod("sayHello", String.class);来替代它,其中第一个参数是方法的名称,第二个参数是参数类型,是一个列表,多个参数可以继续编写多个类型,这样便能够获得反射的方法对象。反射方法时运用 method.invoke(object, "张三");调用的,第一个参数为object,就是确定用哪个对象调用方法,而“张三”是参数,这就等同于object.sayHello("张三");若存在多个参数可以写成Method.invoke(target,obj1,obj2.obj3...),这些要根据对象的具体方法来确定。 1.4 测试 以ReflectServiceImpl为例: 复制代码 1 package com.lean.reflect; 2 import java.lang.reflect.InvocationTargetException; 3 import java.lang.reflect.Method; 4 public class ReflectServiceImpl { 5 //属性 6 private String name; 7 //默认的构造方法 8 public ReflectServiceImpl() { 9 super(); 10 } 11 //带参数的构造方法 12 public ReflectServiceImpl(String name) { 13 this.name=name; 14 } 15 //方法 sayHelo 16 public void sayHello(String name){ 17 System.out.println("hello "+name); 18 } 19 //调用方法 20 public Object reflect(){ 21 ReflectServiceImpl object=null; 22 Object returnObj=null; 23 //反射生成对象 24 try { 25 object = (ReflectServiceImpl) Class.forName("com.lean.ssm.chapter2.reflect.ReflectServiceImpl").newInstance(); 26 //反射生成方法并调度 27 Method method = object.getClass().getMethod("sayHello", String.class); 28 returnObj= method.invoke(object, "张三"); 29 }catch( ClassNotFoundException| NoSuchMethodException| InvocationTargetException| IllegalAccessException| InstantiationException e ) { 30 e.printStackTrace(); 31 } 32 return returnObj; 33 } 34 //获取对象 35 public ReflectServiceImpl getInstance(){ 36 ReflectServiceImpl object=null; 37 try { 38 object=(ReflectServiceImpl)Class.forName("com.lean.ssm.chapter2.reflect.ReflectServiceImpl").newInstance(); 39 } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { 40 e.printStackTrace(); 41 } 42 return object; 43 } 44 //测试 45 public static void main(String[] args) { 46 ReflectServiceImpl rsl= new ReflectServiceImpl(); 47 rsl.reflect(); 48 } 49 } |
推荐了解热门学科
java培训 | Python人工智能 | Web前端培训 | PHP培训 |
区块链培训 | 影视制作培训 | C++培训 | 产品经理培训 |
UI设计培训 | 新媒体培训 | 产品经理培训 | Linux运维 |
大数据培训 | 智能机器人软件开发 |
传智播客是一家致力于培养高素质软件开发人才的科技公司,“黑马程序员”是传智播客旗下高端IT教育品牌。自“黑马程序员”成立以来,教学研发团队一直致力于打造精品课程资源,不断在产、学、研3个层面创新自己的执教理念与教学方针,并集中“黑马程序员”的优势力量,针对性地出版了计算机系列教材50多册,制作教学视频数+套,发表各类技术文章数百篇。
传智播客从未停止思考
传智播客副总裁毕向东在2019IT培训行业变革大会提到,“传智播客意识到企业的用人需求已经从初级程序员升级到中高级程序员,具备多领域、多行业项目经验的人才成为企业用人的首选。”
中级程序员和初级程序员的差别在哪里?
项目经验。毕向东表示,“中级程序员和初级程序员最大的差别在于中级程序员比初级程序员多了三四年的工作经验,从而多出了更多的项目经验。“为此,传智播客研究院引进曾在知名IT企业如阿里、IBM就职的高级技术专家,集中研发面向中高级程序员的课程,用以满足企业用人需求,尽快补全IT行业所需的人才缺口。
何为中高级程序员课程?
传智播客进行了定义。中高级程序员课程,是在当前主流的初级程序员课程的基础上,增加多领域多行业的含金量项目,从技术的广度和深度上进行拓展。“我们希望用5年的时间,打造上百个高含金量的项目,覆盖主流的32个行业。”传智播客课程研发总监于洋表示。
黑马程序员热门视频教程【点击播放】
Python入门教程完整版(懂中文就能学会) | 零起点打开Java世界的大门 |
C++| 匠心之作 从0到1入门学编程 | PHP|零基础入门开发者编程核心技术 |
Web前端入门教程_Web前端html+css+JavaScript | 软件测试入门到精通 |