java反射,反射常用方法,获取类模板,通过类模板对象创建实体对象,类中未定义有参或无参构造器的情况下创建对象,不调用方法尝试给一个类的私有属性赋值,通过反射获取一个类的父类并获取它实现的接口
2019-08-29 17:15
1731 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/undersnowyok/article/details/100141916
java反射
java反射
Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期(运行时)借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法
常用方法
获取类模板
四种方法
1.已知一个类,通过一个类的class静态属性获取,Test.class
2.通过一个类的对象获取, test.getClass();
3.通过类的全限定类名获取,Class.forName(“com.atguigu.javase.Test”);
com.atguigu.javase是包名,Test是类名
前三个可以通过Class类的引用对象来接收
4. 通过类加载器加载对象加载类
ClassLoader classloader = this.getClass().getClassLoader();
classloader对象是为了将class装进内存之中,我们可以通过加载类方法loadClass(全限定类名)来得到类模板,类加载器和类模板不是一个东西,但是有关联
但我们通过getClass()方法拿到类模板,得到的是class+空格+全限定类名
通过类模板对象创建实体对象
Class clazz = Class.forName(“全限定类名”);
Xxx xxx = clazz.newInstance();
Xxx为我们想要创建的对象
类中未定义有参或无参构造器的情况下创建对象
若未定义有参构造器,则通过无参构造器来创建对象
Constructor con = clazz.getConstructors(); con.newInstance();
若未定义无参构造器,则通过有参构造器来创建对象
Constructor con = clazz.getConstructors(形参数据类型列表); con.newInstance(实参列表);
不调用方法尝试给一个类的私有属性赋值
class Teacher{ private int id; private String name; }
看这个类中有两个私有属性,如果我们想要直接赋值是不可能的,但是调用类中的getset方法就可以,然而我们没有写,但是我们可以通过反射来做到
Class clazz = Class.forName("com.atguigu.javase.reflect.Teacher"); Object object = clazz.newInstance(); //首先我们拿到类模板 //clazz.getField("id");这个方法只能拿到共有属性的值,垃圾方法,我们换一个 Field id = clazz.getDeclaredFields("id"); Field name = clazz.getDeclaredFields("name");//本类中的属性都可以拿到 //只有在这个类里我们就都可以拿到这两个属性,但是因为是私有属性,我们还需要一个方法 id.setAccessible(true); name.setAccessible(true); //突破封装:设置需要操作的属性可以被外部访问 id.set(object,123); name.set(object,"姓名"); //在设置属性的时候要传入两个值,后一个值使我们要传入的数据,前一个是我们引用的对象 //就好像 object.set(123); object.set("姓名"); //反射中顺序是有所区别的
通过反射获取一个类的父类,并获取它实现的接口
//假设一个类的类模板已经拿到,是clazz Class clazz2 = clazz.getSuperclass(); //获取到了父类的类模板 Class[] in = clazz.getInterfaces(); //获取它实现的接口 //getDeclaredConstructors();获取全部的构造器 //getFields();只能获取公共的属性 //getDeclaredFields();获取声明所有的属性 //getMethods();获取全部方法(可用的方法) //getDeclaredMethods();获取声明的方法(已经写入的方法)
相关文章推荐
- 通过反射创建私有化类的对象,调用类的私有方法,改变私有属性
- C# 反射-通过继承接口实现创建对象并调用方法
- java程序练习:尝试创建一个父类,在父类中创建两个方法,在子类中覆盖第二个方法,为子类创建一个对象,将他向上转型到基类并调用这个方法。
- 2018/01/08JAVA 基础 / 接口与继承:调用父类/子类的类方法、对象方法,访问父类的类属性、对象属性的方式汇总
- # Java反射2——获取实体所有属性和方法,并对属性赋值
- java 利用反射机制,获取实体所有属性和方法,并对属性赋值
- Java记录 -88- 利用反射机制调用对象的私有方法和属性
- Java反射之通过反射获取一个对象的方法信息(实例代码)
- 如何用反射创建实力对象?如何通过反射为上一个实例对象的x属性重新赋值为?
- java 通过反射获取调用类方法及属性
- java 利用反射机制,获取实体所有属性和方法,并对属性赋值
- Java通过反射调用其他类的私有属性和私有方法
- 定义一个笔记本类,该类有颜色(char)和cpu型号(int)两个属性。 [必做题] 3.1 无参和有参的两个构造方法;有参构造方法可以在创建对象的同时为每个属性赋值; 3.2 输出笔记本信息的方法
- 通过反射获取类对象的属性和方法及破坏私有属性
- 待补充:java类里的私有变量问题,在对象A里有一个对象B,调用对象B的方法获取变量,会有短暂的缓存
- java 利用反射机制,获取实体所有属性和方法,并对属性赋值
- JavaDay08--Homework(定义接口和类并调用属性和方法+对象的多态性+打印对象+判定对象相等)
- java 利用反射机制,获取实体所有属性和方法,并对属性赋值
- Java 动态的创建注入代码,注入方法给类或者接口并通过反射调用
- java创建一个子类对象是会调用父类的构造方法会不会创建父类