您的位置:首页 > 编程语言 > Java开发

Java反射机制

2016-09-21 10:08 316 查看

一、Overview

         Java反射机制是其独有的一种高级动态用法,这个机制可以取得任意一个已知名字的class对象的内部信息,包括其内部的method,field,superclass,interfaces。换句话说,程序在编译的时候根本不知道对应class的任何内部信息,但是在运行的时候可以加载,并获得其结构。

二、使用方法(Demo)

       2.1 Class对象的获取方法

        有三种方法可以获得对应类的Class对象
public class Demo {

public static void main(String[] args) {
Class<?> clazz = null;

/**
* 1. 通过类名进行加载
*/
clazz = Task.class;

/**
* 2. 通过类对象加载
*/
Task task = new Task();
clazz = task.getClass();

/**
* 3.通过完整的包名进行加载
*/
try {
clazz = Class.forName("com.test.mycode.Task");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}

}

class Task{

}


       2.2 创建对象的实例

        通过不同的构造函数实例化对象

      
public class Demo {

public static void main(String[] args) {

Class<?> clazz = null;

try {
clazz = Class.forName("com.test.mycode.Task");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

Task task1 = null;
Task task2 = null;
Task task3 = null;
Task task4 = null;
//注意得到的构造函数是按照声明的倒序进行排列的,赋值的时候注意
Constructor<?>[] cons = clazz.getConstructors();
try {
task1 = (Task)cons[0].newInstance(123,"sff","sff",new Date());
task2 = (Task)cons[1].newInstance(123,"sff","sff");
task3 = (Task)cons[2].newInstance(123,"sff");
task4 = (Task)cons[3].newInstance(123);
} catch (Exception e) {
e.printStackTrace();
}

System.out.println(task1);
System.out.println(task2);
System.out.println(task3);
System.out.println(task4);

}

}

class Task{

private int taskNo;
private String taskName;
private String others;
private Date createTime;

public Task(int taskNo) {

this.taskNo = taskNo;

}
public Task(int taskNo, String taskName) {

this.taskNo = taskNo;
this.taskName = taskName;
}
public Task(int taskNo, String taskName, String others) {

this.taskNo = taskNo;
this.taskName = taskName;
this.others = others;
}

public Task(int taskNo, String taskName, String others, Date createTime) {

this.taskNo = taskNo;
this.taskName = taskName;
this.others = others;
this.createTime = createTime;
}

@Override
public String toString() {
return "Task [taskNo=" + taskNo + ", taskName=" + taskName + ", others=" + others + ", createTime=" + createTime
+ "]";
}

}


       2.3 一些常用的方法

public class Demo {

public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, InstantiationException, NoSuchMethodException, SecurityException, InvocationTargetException {

Class<?> clazz = null;

try {
clazz = Class.forName("com.test.mycode.Task");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

/**
* 得到全部属性值
*/
Field[] field = clazz.getDeclaredFields();//只得到当前类的属性
//field = clazz.getFields();//得到所有的属性(包括父类的和当前类的)
for(int i=0;i<field.length;i++){
System.out.println(field[i].getName());
}

/**
* 设置属性值
*/

field[3].set(Task.class, 245);//一般设置静态变量的值

Task task = (Task) clazz.newInstance();
System.out.println(task.No);

/**
* 得到方法值
*/
Method[] method = clazz.getDeclaredMethods();//只得到当前类的方法
//method = clazz.getMethods();//得到所有的方法(包括父类的和当前类的)
for(int i=0;i<method.length;i++){
System.out.println(method[i].getName());
}

/**
* 调用方法
*/
Method method1 = clazz.getMethod("taskFun1",String.class);
method1.invoke(clazz.newInstance(), "hello");

/**
* 得到修饰符和属性类型
*/
for(int i=0;i<field.length;i++){
//属性说明符
int m = field[i].getModifiers();
String priv = Modifier.toString(m);
//属性类型
Class<?> type = field[i].getType();
System.out.println(priv + " " + type.getName() + " "
+ field[i].getName() + ";");

}

}

}

class Task{

private int taskNo;
private String others;
private Date createTime;
public static int No;

public void taskFun1(String name){
System.out.println("taskFun1:"+name);
}
public void taskFun2(String name){
System.out.println("taskFun1:"+name);
}
public void taskFun3(String name){
System.out.println("taskFun1:"+name);
}

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 反射