本网站(662p.com)打包出售,且带程序代码数据,662p.com域名,程序内核采用TP框架开发,需要联系扣扣:2360248666 /wx:lianweikj
精品域名一口价出售:1y1m.com(350元) ,6b7b.com(400元) , 5k5j.com(380元) , yayj.com(1800元), jiongzhun.com(1000元) , niuzen.com(2800元) , zennei.com(5000元)
需要联系扣扣:2360248666 /wx:lianweikj
Java反射机制可能是涨薪关键!
talkchan · 210浏览 · 发布于2021-07-14 +关注

反射是一种动态类的处理机制,通过 Class类 来实现反射机制;在反射机制下,可以自动获取并调用任意一个类中的组成结构(成员属性、方法),使得代码的编写更加灵活。


Java核心反射机制

基本反射

反射是一种动态类的处理机制,通过 Class类 来实现反射机制;

Class类的基本信息:


  1. Module java.base 

  2. Package java.lang 

  3.     Class Class<T> 

  4.         java.lang.Object 

  5.              java.lang.Class<T> 


以下三种方式获得类的反射,三者都非常重要,牢牢掌握。

一、利用Object类中提供getClass()方法获取实例化对象


  1. class Member {} 

  2. public class JavaReflectDemo { 

  3.     public static void main(String[] args) throws Exception { 

  4.         // 【操作特点】需要获取一个类的实例化对象之后才可以获取Class类实例 

  5.         Member member = new Member() ;    // 实例化Member类对象 

  6.         Class<?> clazz = member.getClass() ;     // 获取Class类实例化对象 

  7.         System.out.println(clazz); 

  8.     } 

二、使用“类.class”形式


  1. class Member {} 

  2. public class JavaReflectDemo { 

  3.     public static void main(String[] args) throws Exception { 

  4.         // 【操作特点】直接通过一个类的完整名称可以获取Class类实例,需要编写import或编写完整类名称 

  5.         Class<?> clazz = Member.class ;     // 获取Class类实例化对象 

  6.         System.out.println(clazz); 

  7.     } 

三、使用Class类内部提供的forName()方法根据类的完整名称获取实例化对象


  1. class Member {} 

  2. public class JavaReflectDemo { 

  3.     public static void main(String[] args) throws Exception { 

  4.         // 【操作特点】通过名称字符串(包.类)可以获取Class类实例,可以不使用import导入 

  5.         // 获取Class类实例化对象 

  6.         Class<?> clazz = Class.forName("cn.xbhog.demo.Member");     

  7.         System.out.println(clazz); 

  8.     } 

反射获取实例化对象


  1. package com.xbhog.反射机制; 

  2. class Member{ 

  3.     public Member() {    // 构造方法 

  4.         System.out.println("【构造方法】实例化Member类对象."); 

  5.     } 

  6.     @Override 

  7.     public String toString() { 

  8.         return "【toString()覆写】博客地址:http://www.cnblogs.com/xbhog"; 

  9.     } 


  10. public class 反射获取对象 { 

  11.     public static void main(String[] args) throws Exception { 

  12.         // 获取Class类实例化对象 

  13.         Class<?> clazz = Class.forName("com.xbhog.反射机制.Member");      

  14.         // 反射机制可以获取任意类实例化对象(等价于关键字“new”),所以返回的类型为Object 

  15.         Object obj = clazz.getDeclaredConstructor().newInstance() ;// 实例化对象 

  16.         System.out.println(obj); 

  17.     } 

反射的机制可以更加方便开发者实现解耦和设计;

反射与类操作

在反射机制下,可以自动获取并调用任意一个类中的组成结构(成员属性、方法),使得代码的编写更加灵活。

反射获取类结构


  1. package com.xbhog.反射机制; 

  2. interface IMessage{ 

  3.     public void send(); 

  4. interface IChannelService{ 

  5.     public Boolean connect(); 


  6. abstract class AbstractBase{} 

  7. public class Mail extends AbstractBase implements IMessage,IChannelService{ 

  8.     @Override 

  9.     public void send() { 

  10.         if(this.connect()){ 

  11.             System.out.println("发送信息成功"); 

  12.         } 

  13.     } 


  14.     @Override 

  15.     public Boolean connect() { 

  16.         return true; 

  17.     } 


  1. package com.xbhog.反射机制; 

  2. public class MailTest { 

  3.     public static void main(String[] args) { 

  4.         Class<Mail> aClass = Mail.class; 

  5.         System.out.println(aClass.getPackage());  //获取类的包名 

  6.         Class<? super Mail> superclass = aClass.getSuperclass(); //获取父类对象信息 

  7.         System.out.println(superclass.getName());  //获取父类名字 

  8.         System.out.println(superclass.getSuperclass().getName());  //获取父类的父类的名字 


  9.         /*获取接口信息*/ 

  10.         Class<?>[] interfaces = aClass.getInterfaces(); 

  11.         for (Class<?> anInterface : interfaces) { 

  12.             System.out.println(anInterface.getName()); 

  13.         } 

  14.     } 

反射调用构造方法

反射还可以调用构造方法,构造方法是类中的重要组成部分,也是实例化对象时必须调用的方法。

实例:


  1. import java.lang.reflect.Constructor; 

  2. class Mail { 

  3.     private String msg ; 

  4.     public Mail() {}// 无参构造 

  5.     public Mail(String msg) {// 单参构造 

  6.         System.out.println("【构造方法】调用Mail类单参构造方法,实例化对象"); 

  7.         this.msg = msg ; 

  8.     } 

  9.     @Override 

  10.     public String toString() {    // 对象信息 

  11.         return "【toString()覆写】消息内容:" + this.msg; 

  12.     } 

  13. public class JavaReflectDemo { 

  14.     public static void main(String[] args) throws Exception { 

  15.         Class<?> cls = Mail.class ; // 获取指定类的Class对象 

  16.         Constructor<?>[] constructors = cls.getDeclaredConstructors() ; // 获取全部构造 

  17.         for (Constructor<?> cons : constructors) { 

  18.             System.out.println(cons); 

  19.         } 

  20.         // 获取单参构造并且参数类型为String的构造方法对象实例 

  21.         Constructor<?> cons = cls.getDeclaredConstructor(String.class) ; 

  22.         Object obj = cons.newInstance("www.cnblog.cn/xbhog") ;// 调用单参构造实例化对象 

  23.         System.out.println(obj); 

  24.     } 

反射调用方法

反射机制中除了获取类中的方法定义外,最为重要的功能就是可以利用Method类中的invoke()方法并结合实例化对象(Object类型即可)实现放射的调用。

反射调用类中的setter、getter方法【重点】


  1. package com.xbhog.反射机制.方法; 


  2. import java.lang.reflect.InvocationTargetException; 

  3. import java.lang.reflect.Method; 


  4. class Member{ 

  5.     private String name; 

  6.     public void setName(String name){ 

  7.         this.name = name; 


  8.     } 

  9.     public String getName(){ 

  10.         return this.name; 

  11.     } 


  12. public class getter_Setter { 

  13.     public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { 

  14.         Class<?> cls = Member.class; 

  15.         String value = "xbhog"; 

  16.         //实例化Member对象 

  17.         Object obj = cls.getDeclaredConstructor().newInstance(); 

  18.         //反射调用方法需要明确的知道方法的名称以及方法中的参数类型 

  19.         String setMethodName ="setName"; 

  20.         Method setmethod = cls.getDeclaredMethod(setMethodName, String.class);  //获取指定方法 

  21.         setmethod.invoke(obj,value);  //对象.setName(value) 

  22.         String getMethodName = "getName"; 

  23.         Method getMethod = cls.getDeclaredMethod(getMethodName);  //get没有参数 

  24.         System.out.println(getMethod.invoke(obj));//对象.getName(); 

  25.     } 

通过放射实现的方法调用的最大的特点是可以直接利用Object类型的实例化对象进行调用的,但是在获取对象时需要明确的知道方法名称以及方法的参数类型。

Field类的作用

在实际开发中,Field中的getType()方法使用的较多,可以通过其来确定属性的类型

示例:


  1. import java.lang.reflect.Field; 


  2. class Member{ 

  3.     private String name; 

  4.     public void setName(String name){ 

  5.         this.name = name; 


  6.     } 

  7.     public String getName(){ 

  8.         return this.name; 

  9.     } 

  10. public class FIeldDemo { 

  11.     public static void main(String[] args) throws Exception { 

  12.         //获取Member类 

  13.         Class<?> cls = Member.class; 

  14.         //实例化 

  15.         Object obj = cls.getDeclaredConstructor().newInstance(); 

  16.         //成员属性name的类型 

  17.         Field name = cls.getDeclaredField("name"); 

  18.         //获取详细信息 

  19.         System.out.println(name.getType().getName()); 

  20.         //获取简略信息 

  21.         System.out.println(name.getType().getSimpleName()); 

  22.     } 

结果:


  1. java.lang.String  String 


相关推荐

PHP实现部分字符隐藏

沙雕mars · 1312浏览 · 2019-04-28 09:47:56
Java中ArrayList和LinkedList区别

kenrry1992 · 896浏览 · 2019-05-08 21:14:54
Tomcat 下载及安装配置

manongba · 957浏览 · 2019-05-13 21:03:56
JAVA变量介绍

manongba · 953浏览 · 2019-05-13 21:05:52
什么是SpringBoot

iamitnan · 1076浏览 · 2019-05-14 22:20:36
加载中

0评论

评论
大家好,我是一名专注技术开发的技术屌丝,有什么问题可以互相交流,一起学习进步,谢谢。
分类专栏
小鸟云服务器
扫码进入手机网页