Java反射之Class,Constructor,Field
来源:互联网 发布:如何制作淘宝网页 编辑:程序博客网 时间:2024/04/30 02:56
1.反射的基石-->Class
1.1.Class类
一个类被类加载器加载到内存中,占用一片存储区域,这个空间里面的内容就是类的 字节码 .
不同的类的字节码是不同的,所以它们在内存中的内容是不同的,这一个个的空间可分别用一个个的对象来表示;
显然可以为这些组织字节码内容的类定义一个类型,它就是Class类型
1.2.如何得到各字节码对应的Class类实例对象
三种方式:
(1)Class cls1=类名.class 相对简单,还是需要明确类名:System.class;
(2)Class cls1=对象.getClass();必须要明确具体的类,并创建对象:new Date().getClass();
(3)Class cls1=Class.forName("完整的类名(带包名)"):Class.forName("java.util.Date")
1.3.九个预定一个Class实例对象
八个基本类型+void.Class
Integer.class包装类的字节码
public static void main(String[] args) throws Exception { // TODO Auto-generated method stub String str1 = "abc"; Class cls1 = str1.getClass(); Class cls2 = String.class; Class cls3 = Class.forName("java.lang.String"); System.out.println(cls1==cls2); System.out.println(cls1==cls3); System.out.println(cls1.isPrimitive());//是否基本类型,String不是基本类型 System.out.println(int.class.isPrimitive());//true System.out.println(int.class==Integer.class);//false,Integer.class是包装类的字节码 System.out.println(int.class==Integer.TYPE);//true,Integer.TYPE是其基本类型的字节码 //数组类型的Class类型实例对象Class.isArray System.out.println(int[].class.isPrimitive());//false System.out.println(int[].class.isArray());//true }
只要在源程序中出现的类型,都有各自的Class实例对,例如 int[],void 等等;
2.反射
就是把JAVA类中的各种成分反射成为相应的JAVA类
反射的好处: 大大的增强了程序的扩展性.
3.反射的基本步骤:
(1)获得Class对象,就是获取到指定的名称的字节码文件对象.
(2)实例化对象,获得类的属性/方法或构造函数.
(3)访问属性、调用方法、调用构造函数创建对象.
4.构造方法的反射应用
4.1.得到某个类中所有的构造方法
Constructor constructors[]= Class.forName("").getConstructors();;
4.2.得到某一个具体的构造方法:用参数定义
Constructor constructor= Class.forName("").getConstructor(StringBuffer.class);
4.3.用反射构建类的实例:中转作用
(1)class-->constructor-->new object:带参数的Constructor的newInstance()
String name="com.dsa.类名";
得到某一个指定构造方法
onstructor constructor= Class.forName("").getConstructor(String.class);
创建实例对象
Object obj=constructor.newInstance("abc");
通过构造方法的反射来new String(new StringBuffer("abc")):newInstance();
/*详细说明:
//用getConstructor来获取构造方法,用StringBuffer.class反射的SB类定义了构造方法的参数类型,
Constructor constructor1 = String.class.getConstructor(StringBuffer.class);
//使用Constructor的newInstance创建实例,注意构造参数对象参数保持之前定义的类型;
//编译期不知道反射过来的对象是String,要加上该类句柄;
String str2 = (String)constructor1.newInstance(new StringBuffer("abc"));
System.out.println(str2.charAt(2));*/
(2)class-->new object
如果构造方法不带参数,可以直接用Class.newInstance();
String name="com.dsa.类名";
寻找该名称类文件,并加载进内存,并非产生Class对象
Class cls=Class.forName(name);
用Class的newInstance()产生该类的对象
Object obj=cls.newInstance();
5.成员变量 Filed类的反射: 代表某个类中的一个成员变量
ReflectPoint pt1=new ReflectPoint(3,5);
Field fieldY=pt1.getClass().getField("y");
System.out.println(fieldY.get(pt1));//get()获得具体对象中的值
Field fieldX=pt1.getClass().getDeclaredField("x");//获得变量不管私有或保护;
fieldX.setAccessible(true);//暴力反射!
System.out.println(fieldX.get(pt1));
成员变量的综合应用:
changeStringValue(pt1);
System.out.println(pt1);
private static void changeStringValue(Object obj) throws Exception { Field[] fields=obj.getClass().getFields();//获得obj的所有变量 for(Field field: fields){// if(field.getType().equals(String.class))//都是字节码用==; if(field.getType()== String.class){ String oldValue = (String)field.get(obj); String newValue = oldValue.replace('b', 'a');//用a替换b; field.set(obj, newValue);//两个对象交换; } } }
- Java反射之Class,Constructor,Field
- Java反射机制--Class,Field,Method,Constructor
- 黑马程序员---初识反射,Class,Constructor,Field
- 反射Class类、Constructor类、Field类
- Java深入(高新技术)(四):反射、Class、Constructor、Method、Field、数组的反射、JavaBean
- JAVA进阶之旅(二)——认识Class类,反射的概念,Constructor,Field,Method,反射Main方法,数组的反射和实践
- 黑马程序员-反射-.class-Class.forName()-object.getClass()-Constructor-Field
- 黑马程序员——Java基础---反射Class类、Constructor类、Field类
- 黑马程序员——Java基础---反射Class类、Constructor类、Field类
- 浅谈Java中的反射机制以及Class、Constructor、Field、Method简单框架原理
- 黑马程序员---反射(Class类、Constructor类、Field类)
- class&constructor&method&field
- java反射之-Field
- java反射之Field
- 【java高级特性之反射】Field类和Constructor类的使用
- Java反射系列之Field
- Java反射之Field用法
- JAVA反射系列之Field
- LeetCode:2.1.6 Longest Consecutive Sequence
- c语言中的字符数组与字符串
- 页面常用布局模板之一:Flow
- (Android review)打开Activity返回结果
- 正则表达式匹配包括换行符的所有字符
- Java反射之Class,Constructor,Field
- Am I crazy?
- 页面常用布局模板之二:Stretch
- C/C++学习笔记:基础知识5
- 解决JSP中文乱码问题
- UVA 437 The Tower of Babylon
- 哎呀
- This Android SDK requires Andriod Developer Toolkit version 20.0.0 or above
- 每日算法之四十三:Rotate List (列表旋转k个元素)