博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅谈Java反射
阅读量:4661 次
发布时间:2019-06-09

本文共 2603 字,大约阅读时间需要 8 分钟。

一、何为反射

  反射就是对于任何一个类都能知道这个类的的所有属性和方法,并且对于任何一个对象都能调用他的属性和方法,而且能修改其属性。

二、反射的作用

  就我的理解来看,通常我们在写代码的时会非常强调代码的逻辑,Java中类之间的链接非常重要,造成很多时候代码耦合度过高,这时会造成很多问题。当使用反射来调用属性和方法时会降低代码的耦合度,更加方便。

三、示例

  这里我写了一个完整的逻辑,其中运用了多个反射类。

  定义两个接口:

package None8;public interface earth {}

 

 

 

package None8;public interface animal {}

 

  定义一个父类,为了简化没有写方法和属性:

package None8;public class simplePerson {}

  定义一个person类继承上面两个接口和父类:

package None8;public class person extends simplePerson implements animal,earth{    String name;    int age;        public void shwo() {        String s = String.format("姓名=%s,年龄=%d", name,age);        System.out.println(s);    }    public person() {            }        //这里的构造函数一定要设为public,不然通过动态加载类创建对象时会报错,读取不到这个构造函数    public person(String name,int age){        this.name = name;        this.age = age;    }}

  客户端类,运用反射来创建并初始化对象,查看类的继承关系和方法:

package None8;import java.lang.reflect.Constructor;import java.lang.reflect.InvocationTargetException;public class client {    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {        // TODO Auto-generated method stub                //通过反射,动态加载对象        //无参构造函数        //Class
泛型 里面的?表示可以处理所有是通配符,里面的person表示处理person类 Class
c =Class.forName("None8.person"); person n =(person)c.newInstance(); n.name = "lemon"; n.age = 22; n.shwo(); //通过反射得到所有构造函数getConstructors //这里有多个构造函数,上面的那个不能加载有参数的构造函数 //通过getConstructors来得到所有的构造函数,构造函数存放在数组中 //注意,构造函数一定要设为public,不然会报错 Constructor
[] cons = c.getConstructors(); person m = (person) cons[1].newInstance("sunk",30); m.shwo(); //通过反射得到所有接口getInterfaces //可以将所有继承的接口都展示出来 //接口同样存放在数组中 System.err.println("接口有:");      Class
[] inter = c.getInterfaces(); for (int i = 0;i < inter.length;i++) { System.err.println(inter[i].getName()); } System.err.println("父类有:"); //通过反射得到所有父类getSuperclass //Class
superc = (Class
) c.getSuperclass(); System.err.println(c.getSuperclass().getName()); }}

  运行结果:

  

 

三、总结

  我在刚接触反射的时最疑惑的就是我们之前通常用的new和反射中Class.forName()与Class.forName().newInstance()三者之间的关系。后来通过查询资料了解了。new只是一个关键字,后两者都是Class类下的方法。Class.forName()在反射中用来动态加载类,创建的对象的类型为该类的类型,这就可以看出来单单使用Class.forName()这个方法所创建的对象我们是无法使用的,这时就要使用newInstance()方法静态方法来实例化对象。

  这里仅仅只是我对反射的浅显的理解,一边学习一边分享!

 

  如有错误,希望大家能指正,感谢!

  努力努力再努力!

转载于:https://www.cnblogs.com/lemonxu/p/10532939.html

你可能感兴趣的文章
Angular 开发环境搭建
查看>>
基础练习 数列特征
查看>>
个人工作总结9
查看>>
英语词性-句子成分-构词法
查看>>
Spark环境常用配置(profile)
查看>>
hive学习8
查看>>
GROUP BY子句
查看>>
[你必须知道的.NET]第十六回:深入浅出关键字---using全接触
查看>>
SQL language 根据语言来返回不同的结果
查看>>
light,node.js,webStorm 安装项目搭建
查看>>
1.40(玩弄函数:对一个参数应用两次函数的函数)
查看>>
linux 下 vim 的使用 (ubuntu 12.04)
查看>>
VMware coding Challenge: Coin Toss Betting
查看>>
js 随机打乱数组
查看>>
安装VS2015出现的bug,各位安装请注意
查看>>
Linux 命令 --- top
查看>>
PopUpWindow使用详解(二)——进阶及答疑
查看>>
JavaScript 学习笔记2
查看>>
调用KEditor批量上传图片
查看>>
C# UserControl集合属性使用
查看>>