Java 之 反射与类操作(反射取得父类信息、构造方法、普通方法、类中属性)

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类中提供有两组取得属性的方法:

  1. 第一组(父类中)-取得类中全部属性: public Field[] getFields() throws SecurityException
  2. 第一组(父类中)-取得类中指定名称属性: public Field getField(String name) throws NoSuchFieldException, SecurityException
  3. 第二组(本类中)-取得类中全部属性: public Field[] getDeclaredFields() throws SecurityException
  4. 第二组(本类中)-取得类中指定名称属性 : 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);
            }
        }
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值