1.取得父类信息
在Java中,任何的程序类都一定会有父类,在Class类中就可以通过如下方法来取得父类或者实现的父接口:
- 取得类的包名称: public Package getPackage()
eg:
interface IFruit {}
interface IMessage{}
class CLS implements IFruit,IMessage{}
public class Test {
public static void main(String[] args) {
Class<?> cls = CLS.class ;
// 取得Class类对象
System.out.println(cls.getPackage().getName());
}
}
- 取得父类的Class对象: public native Class<? super T> getSuperclass();
- 取得实现的父接口:public Class<?>[] getInterfaces()
eg:
interface IFruit {}
interface IMessage{}
class CLS implements IFruit,IMessage{}
public class Test {
public static void main(String[] args) {
Class<?> cls = CLS.class ;
// 取得Class类对象
// 取得Package名称
System.out.println(cls.getPackage().getName());
// 取得父类名称
System.out.println(cls.getSuperclass().getName());
// 取得实现的父接口对象
Class<?>[] iClass = cls.getInterfaces() ;
for (Class<?> class1 : iClass) {
System.out.println(class1.getName());
}
}
}
2.反射调用构造
一个类中可以存在多个构造方法,如果要想取得类中构造的调用,就可以使用Class类中提供的两个方法:
- 取得指定参数类型的构造:
public Constructor<T> getConstructor(Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException
- 取得类中的所有构造:
public Constructor<?>[] getConstructors() throws SecurityException
通过反射实例化对象:`public T newInstance(Object … initargs) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException
eg:取得类中所有构造信息
import java.lang.reflect.Constructor;
class Person {
public Person() {}
public Person(String name) {}
public Person(String name,int age) {}
}
public class Test {
public static void main(String[] args) {
Class<?> cls = Person.class ;
// 取得类中的全部构造
Constructor<?>[] constructors = cls.getConstructors() ;
for (Constructor<?> constructor : constructors) {
System.out.println(constructor);
}
}
}
以上的操作是直接利用了Constructor类中的toString()方法取得了构造方法的完整信息(包含方法权限,参数列 表),而如果你只使用了getName()方法,只会返回构造方法的包名.类名。
3.反射调用普通方法(重点)
- 取得全部普通方法:
public Method[] getMethods() throws SecurityException
- 取得指定普通方法:
public Method getMethod(String name, Class<?>... parameterTypes)
eg:取得一个类中的全部普通方法
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
class Person {
private String name ;
private int age ;
public Person() {}
public Person(String name,int age) {
this.name = name ;
this.age = age ;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
} 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 class Test {
public static void main(String[] args) throws Exception {
Class<?> cls = Person.class ;
Method[] methods = cls.getMethods() ;
for (Method method : methods) {
System.out.println(method);
}
}
}
eg:反射调用setter、getter方法
import java.lang.reflect.Method;
class Person {
private String name ;
private int age ;
public Person() {}
public Person(String name,int age) {
this.name = name ;
this.age = age ;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
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 class Test {
public static void main(String[] args) throws Exception {
Class<?> cls = Class.forName("www.bit.java.testthread.Person") ;
// 任何时候调用类中的普通方法都必须有实例化对象
Object obj = cls.newInstance() ;
// 取得setName这个方法的实例化对象,设置方法名称与参数类型
Method setMethod = cls.getMethod("setName", String.class) ;
// 随后需要通过Method类对象调用指定的方法,调用方法需要有实例化对象
// 同时传入参数
setMethod.invoke(obj, "CUNZ") ;
// 相当于Person对象.setName("CUNZ") ;
Method getMethod = cls.getMethod("getName") ;
Object result = getMethod.invoke(obj) ;
// 相当于Person对象.getName() ;
System.out.println(result) ;
}
}
4.反射调用类中属性
在Class类中提供有两组取得属性的方法:
- 第一组(父类中)-取得类中全部属性: public Field[] getFields() throws SecurityException
- 第一组(父类中)-取得类中指定名称属性: public Field getField(String name) throws NoSuchFieldException, SecurityException
- 第二组(本类中)-取得类中全部属性: public Field[] getDeclaredFields() throws SecurityException
- 第二组(本类中)-取得类中指定名称属性 : public Method getDeclaredMethod(String name, Class<? >… parameterTypes) throws NoSuchMethodException, SecurityException
eg:取得类中全部属性
import java.lang.reflect.Field;
class Person {
public String name ;
public int age ;
}
class Student extends Person {
private String school ;
}
public class Test {
public static void main(String[] args) throws Exception {
Class<?> cls = Class.forName("www.bit.java.testthread.Student") ;
{
// 普通代码块
// 第一组-取得类中全部属性
Field[] fields = cls.getFields() ;
for (Field field : fields) {
System.out.println(field) ;
}
}
System.out.println("------------------------");
{
// 第二组-取得类中全部属性
Field[] fields = cls.getDeclaredFields() ;
for (Field field : fields) {
System.out.println(field);
}
}
}
}