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

Java 反射机制

2014-06-24 14:48 274 查看
Person.java

public class Person {
private static String TAG = "Person";
public int id;
private String name;
private int age;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

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

public int getAge() {
return age;
}

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

public static String getTAG() {
return TAG;
}

public Person(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}

public Person() {
super();
this.id = 11;
}

@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
}

public int sum(int... numbers) {
if (numbers.length == 0)
return -1;
int total = 0;
for (int n : numbers)
total += n;
return total;
}
}


Class类

package reflect;

public class reflectClass {

public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
// 1.通过类来得到Class对象
Class<?> clz1 = Person.class;
System.out.println("clz1----->" + clz1);

// 2.通过对象来获取其Class信息
Person p = new Person();
Class<?> clz2 = p.getClass();
System.out.println("clz2----->" + clz2);

// 3.通过Class.forName()方式获取Class信息
Class<?> clz3 = Class.forName("reflect.Person");
System.out.println("clz3----->" + clz3);

System.out.println(clz1 == clz2);
System.out.println(clz3 == clz2);

Class<Person> clz4 = Person.class;
Person person = clz4.newInstance();
System.out.println("person----->" + person);
}

}

输出结果:

clz1----->class reflect.Person
clz2----->class reflect.Person
clz3----->class reflect.Person
true
true
person----->Person [id=11, name=null, age=0]


Field类

package reflect;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class reflectField {

public static void main(String[] args) throws NoSuchFieldException,
SecurityException, IllegalArgumentException, IllegalAccessException {
Person person = new Person(1001, "zhang", 18);
Class<?> clz = person.getClass();
// 如何获取公有字段
Field f = clz.getField("id");
System.out.println(f);
Object obj = f.get(person);
System.out.println("公有字段id----->" + obj);

// 如何获取私有字段
f = clz.getDeclaredField("name");
System.out.println(f);
f.setAccessible(true);
obj = f.get(person);
System.out.println("私有字段name----->" + obj);

// 如何获取静态字段
f = clz.getDeclaredField("TAG");
System.out.println("该属性是否为静态属性:" + Modifier.isStatic(f.getModifiers()));
System.out.print("获取:");
f.setAccessible(true);
System.out.println("" + f.get(null));
System.out.print("设置 : ");
f.set(null, "new value");
System.out.println(Person.getTAG());

// 获取所有字段
Field[] fs = clz.getDeclaredFields();
for (Field field : fs) {
System.out.println(field);
}
}

}

输出结果:

public int reflect.Person.id
公有字段id----->1001
private java.lang.String reflect.Person.name
私有字段name----->zhang
该属性是否为静态属性:true
获取:Person
设置 : new value
private static java.lang.String reflect.Person.TAG
public int reflect.Person.id
private java.lang.String reflect.Person.name
private int reflect.Person.age


Method类

package reflect;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class reflectMethod {

@SuppressWarnings("unchecked")
public static void main(String[] args) throws NoSuchMethodException,
SecurityException, IllegalAccessException,
IllegalArgumentException, InvocationTargetException {
Person person = new Person(1, "李四", 20);
Class<Person> clz = (Class<Person>) person.getClass();

Method method = clz.getMethod("getAge");
int age = (Integer) method.invoke(person);
System.out.println(age);

Method setMethod = clz.getDeclaredMethod("setAge", int.class);
setMethod.setAccessible(true);
setMethod.invoke(person, 30);
System.out.println(person.getAge());

Method arrayMethod = clz.getDeclaredMethod("sum", int[].class);
int result = (Integer) arrayMethod
.invoke(person, new int[] { 1, 2, 3 });
System.out.println(result);
}

}


Employee.java

package reflect;

public class Employee {
private static Employee employee;
private int id;
private String name;

private Employee() {

}

private Employee(int id, String name) {
super();
this.id = id;
this.name = name;
}

public static Employee getInstance() {
if (employee == null)
employee = new Employee();
return employee;
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

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

@Override
public String toString() {
return "Employee [id=" + id + ", name=" + name + "]";
}

}


Constructor类

package reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class reflectConstructor {

@SuppressWarnings("unchecked")
public static void main(String[] args) throws InstantiationException,
IllegalAccessException, NoSuchMethodException, SecurityException,
IllegalArgumentException, InvocationTargetException {
// 使用无参/默认构造器创建对象实例
Class<?> clz = Person.class;
Person instance = (Person) clz.newInstance();
System.out.println(instance);

// 调用公开构造器创建对象实例(有参)
Constructor<Person> constructors = (Constructor<Person>) clz
.getConstructor(int.class, String.class, int.class);
Person person = constructors.newInstance(1001, "李四", 20);
System.out.println(person);

Employee employee = Employee.getInstance();
employee.setId(1001);
System.out.println(employee);

Employee employee1 = Employee.getInstance();
Employee employee2 = Employee.getInstance();

System.out.println(employee1 == employee2);

Class<Employee> empClz = Employee.class;
Constructor<Employee> cons = (Constructor<Employee>) empClz.getDeclaredConstructor(int.class,String.class);
cons.setAccessible(true);
Employee emp = cons.newInstance(101,"zhang");
System.out.println(emp);
}

}

输出结果:

Person [id=11, name=null, age=0]
Person [id=1001, name=李四, age=20]
Employee [id=1001, name=null]
true
Employee [id=101, name=zhang]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: