反射1
来源:互联网 发布:淘宝设置公益宝贝 编辑:程序博客网 时间:2024/06/05 11:31
什么是反射机制重点内容
反射就是获取到该类的字节码文件对象,Class类对象,Class类就代表了该类的字节码对象,通过Class类对象获取该类里面的一些属性(成员变量),构造方法成员方法
面试题: 重点*
如何获取类的字节码文件对象,并且有几种方式呢?
1)Object类中的getClass()方法,表示正在运行的那个类:Class类
2)数据类型的class属性 举例:String.class,Student.class
3)Class类中的特有方法:forName(String className):重点 常用
public static Class< ?> forName(String className):获取字节码文件对象
开发中常使用的方式,因为第三种里面的参数是一个字符串…,字符串的内容是一个类的全路径名称(包名+类名)
Person p1=new Person(); Class class1 = p1.getClass(); Person p2=new Person(); Class class2 = p2.getClass(); Class class3= Person.class; System.out.println(class1==class2);//true System.out.println(class1==class3);//true 因为Person的Class文件只有一个 得到的Class对象也一定相同
使用的Person类
public class Person {private String name;public int age;private String address;Person(){}public Person(String name) { super(); this.name = name;}public Person(String name, int age, String address) { super(); this.name = name; this.age = age; this.address = address;} private Person(int age,String address){ this.address=address; this.age=age; }@Overridepublic String toString() { return "Person [name=" + name + ", age=" + age + ", address=" + address + "]";} public void show(){ System.out.println("无参show"); } public void show(String name){ System.out.println(name); } private String getMessage(){ return "hello"; }}
说明 :Person的全路径名字 org.westos.reflect_01.Person
Class对象的方法
1获得构造器对象Constructor
public Constructor< T> getConstructor(Class
//获得代表Person类字节码文件的类对象 Class class1 = Class.forName("reflect.Person"); //获得Person类的构造器对象 该构造对象有一个参数 类似于 Person(String name) Constructor con=class1.getConstructor(String.class); //通过构造器对象创建实例 //相当于Person p=new Person("王帅"); Object object = con.newInstance("王帅"); System.out.println(object);//Person [name=王帅, age=0, address=null] }
实例2 获得非Public型的构造并创造出对象
Class class1 = Class.forName("reflect.Person"); //通过此方法获得的构造对象,可以使任意权限修饰的 Constructor con=class1.getDeclaredConstructor(int.class,String.class); con.setAccessible(true);//必须设置为true 不然private的修饰无权限访问 //会有java.lang.IllegalAccessException:异常 Object object = con.newInstance(20,"王帅"); System.out.println(object);//Person [name=null, age=20, address=王帅]
2获得对象属性的方法
获取所有的公共的成员变量public Field[] getFields():
所有的公共的可访问的字段,返回的是Field对象数组
public Field[] getDeclaredFields():获取当前字节码文件对象中所有的公共的或者私有的字段
提示:Field代表的是对象的属性对象
对象输出内容是:public java.lang.String org.westos.reflect_01.Person.address
获取单个属性对象
public Field getField(String name):获取公共的指定的字段
就是指定获取名字为什么的属性对象 如:参数为当前成员变量名称”address”,就获得了代表address的属性对象
对象属性的方法:public void set(Object obj, Object value)
就是把某个属性和具体的对象绑定,为某一个对象属性赋值
Field addressFiled = c.getField(“address”) ;
addressFiled.set(obj, “北京”) ;为obj对象的address赋值 北京
实例3 为对象的属性赋值
Class class1 = Class.forName("reflect.Person"); //获取无参构造对象 Constructor con=class1.getDeclaredConstructor(); Object object = con.newInstance(); //分别获得 age 和address的属性对象 Field agefield = class1.getDeclaredField("age"); Field addressfield = class1.getDeclaredField("address"); //因为address是private的所以 要设置可见 addressfield.setAccessible(true); //把age 和address的属性对象绑定到指定的对象 object addressfield.set(object, "北京"); agefield.set(object, 20); System.out.println(object);//Person [name=null, age=20, address=北京]
3获取成员方法Method对象
public Method getMethod(String name,Class
Class class1 = Class.forName("reflect.Person"); Constructor con=class1.getDeclaredConstructor(); Object object = con.newInstance(); //得到方法名字为show方法对象 该方法参数类型是String Method m=class1.getDeclaredMethod("show", String.class); //调用show方法 传递hello参数 自动就输出 hello m.invoke(object, "hello");//输出结果 hello
实例5 得到无参private方法对象并且调用该方法
Class class1 = Class.forName("reflect.Person"); Constructor con=class1.getDeclaredConstructor(); Object object = con.newInstance(); //得到方法名字为show方法对象 该方法没有参数 Method m=class1.getDeclaredMethod("show"); //调用show方法 设置显示可见 m.setAccessible(true); m.invoke(object);//无参show
- 反射1
- 反射1
- 反射(1)
- 反射 1
- 反射1
- 反射1
- java反射1——反射源头
- 反射机制学习1(反射创建对象)
- 类反射(1)初识类反射
- Java300StudyNote(1)-反射机制-提高反射效率
- .Net 反射 1
- Java反射1
- java反射1
- Java反射笔记1
- Java反射(1)
- 反射(1)
- 反射(1)
- 何为反射(1)
- linux nohup命令实现退出终端后程序继续后台运行
- 单片机实验-利用定时器产生方波
- JS原型+原型链
- 排序实例(冒泡+归并)
- 微信access_token、jsapi_ticket中控服务器
- 反射1
- 对操作控制器的整体把握
- 希捷硬盘解决目录或文件无法读取问题(20171210)特此记录
- 不忘初心,砥砺前行。
- Intellij IDEA使用(六)—— 使用Intellij IDEA创建Java项目并配置jar包
- 用ant打包可运行的jar文件 (将第三方jar包放进你自己的jar包)
- Hibernate中的 Session 与Transaction
- 《C++ Primer Plus》读书笔记(一、二章)
- solidity智能合约开发工具Atom及其插件安装