java反射(Reflect)(一)

2014-11-24 09:12:26 · 作者: · 浏览: 0

反射的基石是 Class 类,Class 类代表的是 java 源文件通过编译后得到的字节码,

获得 Class 类型 的几种方法:

1. 类名.class

2. 对象名.getClass()

3. Class.forName("类路径")


构造方法的反射:


package test;

import java.lang.reflect.Constructor;
/**
*
* @描述 反射基础
* @作者 fancy
* @邮箱 fancydeepin@yeah.net
* @日期 2012-8-24


*
*/
public class ReflectApp {

public static void main(String[] args){

try {
//取得Class
Class< > clazz = Class.forName("java.lang.Integer");
//取得类中参数为String类型的构造器
Constructor< > constructor = clazz.getConstructor(String.class);
//使用构造器创建一个实例对象
Object obj = constructor.newInstance("10");
//打印结果
System.out.println(obj);
} catch (Exception e) {
e.printStackTrace();
}
}

}

后台打印输出结果:


10


成员变量的反射:


package test;

import java.lang.reflect.Field;

/**
* -----------------------------------------
* @描述 反射基础
* @作者 fancy
* @邮箱 fancydeepin@yeah.net
* @日期 2012-8-24


* -----------------------------------------
*/
public class ReflectApp {

public static void main(String[] args){

try {
//创建一个Person实例对象
Person person = new ReflectApp().new Person();
//取得Class
Class< > clazz = person.getClass();
/******** 通过反射访问 public 权限的属性变量 ********/
//取得字段的属性名
Field age = clazz.getDeclaredField("age");
//设置该属性的值
age.set(person, 22);

/******* 通过反射访问 protected 权限的属性变量 *******/
Field mail = clazz.getDeclaredField("mail");
mail.set(person, "fancydeepin@yeah.net");

/******** 通过反射访问 private 权限的属性变量 ********/
Field name = clazz.getDeclaredField("name");
//private修饰的变量不能直接访问,如需访问必须要将setAccessible的值设置成true,也就是强制访问,或者说是暴力访问
name.setAccessible(true);
name.set(person, "fancy");
System.out.println(person);
} catch (Exception e) {
e.printStackTrace();
}
}

//内部类
public class Person {

public int age;
private String name;
protected String mail;

public int getAge() {
return age;
}

public String getName() {
return name;
}

public void setAge(int age) {
this.age = age;
}

public void setName(String name) {
this.name = name;
}

public String getMail() {
return mail;
}

public void setMail(String mail) {
this.mail = mail;
}

@Override
public String toString() {

return "Name is:" + name + ",\t Age is:" + age + ",\t Mail is:" + mail;
}

}
}

后台打印输出结果:


Name is:fancy, Age is:22, Mail is:fancydeepin@yeah.net


成员方法的反射:


package test;

import java.lang.reflect.Method;

/**
* -----------------------------------------
* @描述 反射基础
* @作者 fancy
* @邮箱 fancydeepin@yeah.net
* @日期 2012-8-24


* -----------------------------------------
*/
public class ReflectApp {

public static void main(String[] args){

try {
//取得Class
Class< > clazz = Class.forName("test.ReflectApp");
//取得方法
Method method = clazz.getDeclar