JAVA反射机制
来源:互联网 发布:证券时报股市大数据 编辑:程序博客网 时间:2024/06/06 07:37
JAVA反射机制
---雨竹清风
JAVA反射机制:是指程序在运行时能够获取的类中的信息。在JAVA中只要有类的名字就可以通过反射机制来获取所有的信息。
现在的许多框架就是使用了这种反射机制来实现的,例如:Hibernate、struts。反射机制的优点就是可以实现动态创建对象和编译。
JAVA的反射机制的实现是要借助于4个类:Class, Field, Method, Constructor。
Class:程序运行时,JAVA运行时系统会对所有的对象进行运行时类型的处理。这项信息记录了每个对象所属的类,虚拟机用运行时的类型信息来选择正确的方法来执行。在Object类中定义了getClass()方法。所以我们可以通过这个方法来得到其对象。
Field:类的属性对象,可以通过Field对象获得类的成员变量的有关信息。
Method:类的方法对象。可以通过Method对象来获得有关指定类中方法的相关信息。
Constructor:类的构造器对象。可以通过Constructor对象来获得有关指定类的相关信息。
常用的:
获得构造函数的方法
Constructor getConstructor(Class[] params)//根据指定参数获得public构造器
Constructor[]getConstructors()//获得public的所有构造器
ConstructorgetDeclaredConstructor(Class[] params)//根据指定参数获得public和非public的构造器
Constructor[]getDeclaredConstructors()//获得public的所有构造器
获得类方法的方法
Method getMethod(String name, Class[] params),根据方法名,参数类型获得方法
Method[] getMethods()//获得所有的public方法
MethodgetDeclaredMethod(String name, Class[] params)//根据方法名和参数类型,获得public和非public的方法
Method[]getDeclaredMethods()//获得所以的public和非public方法
获得类中属性的方法
Field getField(String name)//根据变量名得到相应的public变量
Field[] getFields()//获得类中所以public的方法
Field getDeclaredField(Stringname)//根据方法名获得public和非public变量
Field[] getDeclaredFields()//获得类中所有的public和非public方法
反射机制例子:
这一天来一直研究的反射机制的例子:
以获得构造函数的相关信息为例
MoreConstructor类
public class MoreConstructor {
String s;
int i1 = 0,i2 = 0,i3 = 0;
private MoreConstructor(){
}
protected MoreConstructor(String s, int i)throws NumberFormatException{
this.i1 = i;
this.s = s;
}
public MoreConstructor(String...var){
if(0 < var.length){
i1 = Integer.valueOf(var[0]);
}
if(1 < var.length){
i2 = Integer.valueOf(var[1]);
}
if(2 < var.length){
i3 = Integer.valueOf(var[2]);
}
}
public void print(){
System.out.println("s: "+s);
System.out.println("i1: "+i1);
System.out.println("i2: "+i2);
}
在main方法中代码:
MoreConstructor类
public class MoreConstructor {
String s;
int i1 = 0,i2 = 0,i3 = 0;
private MoreConstructor(){
}
protected MoreConstructor(String s, int i)throws NumberFormatException{
this.i1 = i;
this.s = s;
}
public MoreConstructor(String...var){
if(0 < var.length){
i1 = Integer.valueOf(var[0]);
}
if(1 < var.length){
i2 = Integer.valueOf(var[1]);
}
if(2 < var.length){
i3 = Integer.valueOf(var[2]);
}
}
public void print(){
System.out.println("s: "+s);
System.out.println("i1: "+i1);
System.out.println("i2: "+i2);
}
Class<MoreConstructor> exampleC = MoreConstructor.class;
Constructor[] declaredConstructors = exampleC.getDeclaredConstructors();
for(int i = 0; i < declaredConstructors.length; ++i){
Constructor constructor = declaredConstructors[i];
System.out.println("查看是否有可变参数:"+constructor.isVarArgs());
System.out.println("该构造函数的入口参数依次是:");
Class [] parameter = constructor.getParameterTypes();//返回所有的参数类型
for(int j = 0; j < parameter.length; ++j){
System.out.println(parameter[j] + " ");
}
Class []exceptionArray = constructor.getExceptionTypes();//获得所有的异常
System.out.println("抛出异常类型:");
for(int j = 0; j < exceptionArray.length; ++j){
System.out.println(exceptionArray[j]);
}
MoreConstructor ex2 = null;
while(ex2 == null){
try {
if(i == 0){
ex2 = (MoreConstructor) constructor.newInstance("7",3 );//注意参数必须与当时获取的方法名字对应
}
else if(i == 1){
String []s = new String[]{"100","200","300"};
ex2 = (MoreConstructor) constructor.newInstance((Object)s);
}
else{
ex2 = (MoreConstructor) constructor.newInstance();
}
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("在创建对象时出现异常"+e);
constructor.setAccessible(true);//设置为public,构造方法的权限修改为public
continue;
}
ex2.print();
System.out.println();
}
}
注意:
MoreConstructor moreCons = new MoreConstructor();//下面沒有用到這個對象,所以可以删去
Class<MoreConstructor>exampleC = MoreConstructor.class;
Constructor[]declaredConstructors = exampleC.getDeclaredConstructors();
这三句话可以改为2句:
MoreConstructor moreCons = new MoreConstructor();
Constructor[]declaredConstructors = moreCons.getClass().getDeclaredConstructors();
- 【反射】JAVA反射机制
- 【Java】JAVA反射机制
- Java 反射机制[Field反射]
- Java 反射机制[Method反射]
- Java反射机制笔记-反射机制
- java的反射机制
- Java的反射机制
- java反射机制详解!
- Java反射机制
- Java的反射机制
- java 反射机制--侯捷
- java反射机制
- java反射机制
- [候捷]Java反射机制
- java 反射机制
- java 反射机制初探
- 关于Java反射机制
- java反射机制
- deque(1)
- deque(2)
- JAVA反射机制
- class [Ljava.lang.String; 和class java.lang.String; 的区别
- IOS 去空格处理 特殊字符处理
- JAVA反射机制
- Linux传文件和编译文件,运行文件
- 动态(程序运行时)生成枚举类型
- 修改文件的默认权限:umask
- 堆排序
- 改变文件的属性
- 顺序统计量和中位数
- Efficient Route Planning on Public Transportation Networks: A Labelling Approach
- 数组形参