反射入门
来源:互联网 发布:网站美工教程 编辑:程序博客网 时间:2024/04/29 18:04
常见的反射类
JAVA中获取Class对象有3种方式:
1.Class.forName()
2.Object.getClass()
3.类字面常量 xx.class
获取类的构造器
首先介绍一下Constructor类,这个类用来封装反射得到的构造器,Class有四个方法来获得Constructor对象
public Constructor<?>[] getConstructors() 返回类中所有的public构造器集合,默认构造器的下标为0
public Constructor<T> getConstructor(Class<?>... parameterTypes) 返回指定public构造器,参数为构造器参数类型集合
public Constructor<?>[] getDeclaredConstructors() 返回类中所有的构造器,包括私有
public Constructor<T> getDeclaredConstructor(Class<?>...parameterTypes) 返回任意指定的构造器
获取类的成员变量
成员变量用Field类进行封装,主要的方法非常的类似:
public Field getDeclaredField(String name) 获取任意指定名字的成员
public Field[] getDeclaredFields() 获取所有的成员变量
public Field getField(String name) 获取任意public成员变量
public Field[] getFields() 获取所有的public成员变量
获取类的方法
public Method[] getMethods() 获取所有的共有方法的集合
public Method getMethod(String name,Class<?>... parameterTypes) 获取指定公有方法 参数1:方法名 参数2:参数类型集合
public Method[] getDeclaredMethods() 获取所有的方法
public Method getDeclaredMethod(String name,Class<?>... parameterTypes) 获取任意指定方法
一通过反射机制得到类的包名和类名
son son= new son();//打印包名
System.out.println(son.getClass().getPackage().getName());
//打印类名
System.out.println(son.getClass().getName());
结果:
Testreflection
Testreflection.son
二无参构造函数创建实例
Class<?> class1=null;
class1=Class.forName("Testreflection.son");
fatherfather=(father)class1.newInstance();
father.setName("小明");
System.out.print(father.getName());
结果:
小明
三有参构造函数创建实例
//获得所有构造函数
Constructor[]constructors=son.getClass().getConstructors();
for(int i=0;i<constructors.length;i++){
System.out.println(constructors[i].getName());
}
//结果
Testreflection.son
Testreflection.son
//获得一个参数的构造函数
//一个参数的构造函数
Constructorconstructors1=son.getClass().getConstructor(String.class);
//结果
我是一个参数的构造函数
//两个参数的构造函数
Constructorconstructor2=son.getClass().getConstructor(String.class,String.class);
四修改字段信息
//获得所有的字段信息私有的和非私有的
Field[] string= son.getClass().getDeclaredFields();
//获得私有的字段名称
Fieldname= son.getClass().getDeclaredField("name");
//获得公有的字段名称
Fieldsex=son.getClass().getField("sex");
System.out.print(name.toString());
System.out.print(sex.toString());
//name只是字段的名称不包含字段里的值,想修改其内容如下做
name.setAccessible(true); //私有字段允许修改
Objectobj=son.getClass().newInstance();
name.set(obj,"梨花");
//修改之后的值
System.out.print(name.get(obj));
五通过反射调用类方法
son son= new son();
//调用无参方法
Methodrun=son.getClass().getMethod("run");
//调用有参方法
Methodsleep=son.getClass().getMethod("sleep", String.class);
//静态方法
Methodread=son.getClass().getMethod("read");
run.invoke(son.getClass().newInstance());
sleep.invoke(son.getClass().newInstance(),"");
read.invoke(null);
MethodintHandle=son.getClass().getMethod("intHandle",int[].class);
MethodstringHandle=son.getClass().getMethod("stringHandle", String[].class);
//普通的int类型一唯数组不能转换为object数组
intHandle.invoke(son.getClass().newInstance(),(Object) newint[]{1,2,3});
//string类型数组可以转换成为object类型的数组
stringHandle.invoke(son.getClass().newInstance(),newObject[]{newString[]{"2","4","5"}});
- 反射入门
- 反射入门
- 反射入门
- 反射入门
- 反射入门
- 反射入门
- 反射入门及应用
- C# 反射入门知识
- C# 反射入门知识
- C# 反射入门知识
- C# 反射入门知识
- 反射使用入门
- C# 反射入门知识
- C# 反射入门知识
- java 反射入门
- C#反射使用入门
- C# 反射入门知识
- C# 反射入门知识
- 有关 内存溢出、泄露、越界、缓冲区溢出、栈溢出
- 4步win7下简单FTP服务器搭建(试验成功)
- LeetCode_113Path Sum II
- C++ outline and interview questions (2): Pointers
- Leetcode Q9: Palindrome Number
- 反射入门
- /*+ BYPASS_UJVC */ 处理数据更新时不能更新问题
- 用什么判断UITextField判断为空
- Sudoku Solver
- 黑马程序员——Java学习总结:Java编程基础
- C++中static成员的用法汇总
- 搞个这样的APP要多久
- 【暑假测试2】A HDU 1021 Fibonacci Again(水:递推、找规律)
- 精通Hibernate——建立单向多对一关联