java高级-反射获取对象的18代祖宗

一、概述

java反射不仅仅只用于对象的实例化,更多的情况下用于类的组成结构操作。类的基本组成结构:父类(父接口)、包、属性、方法(构造方法、普通方法)

建立如下结构程序:

package com.cz.parent;

public interface IMessage {
    void  send();
}
package com.cz.parent;

public interface IService {
    void  service();
}
public abstract class Study {

}
package com.cz.entity;

import com.cz.parent.IMessage;
import com.cz.parent.IService;
import com.cz.parent.Study;

public  class Person extends Study implements IMessage,IService {
    private String name;
    private int age;

    public Person(){
        System.out.println("这是无参构造方法!!");
    }

    public Person(String name,int  age){
        this.name = name;
        this.age  = age;
    }
    public String toString(){
        return "名字:"+this.name+"年龄:"+this.age;
    }

    @Override
    public void send() {
        System.out.println("消息发送");
    }

    @Override
    public void service() {
        System.out.println("提供服务");
    }
}

二、获取父类信息

2.1 获取包名

public class Test {
    public static void main(String[] args) {
        Class<?> cls = Person.class;
        Package pac = cls.getPackage();
        System.out.println(pac.getName());
    }
}

输出结果:

340f3fbb44a0f778e3f29f4d3467391d339.jpg

2.2 获取父类信息

public class Test {
    public static void main(String[] args) {
        Class<?> cls = Person.class;
        Class<?> superclass = cls.getSuperclass();
        System.out.println(superclass.getName());
    }
}

输出结果:

fe7ed1c2fc8bc8de483cea66670ad027880.jpg

2.3 获取父接口信息

public class Test {
    public static void main(String[] args) {
        Class<?> cls = Person.class;
        Class<?>[] interfaces = cls.getInterfaces();
        for (Class<?> temp: interfaces
             ) {
            System.out.println(temp.getName());
        }
    }
}

输出结果:

d9740ab9bbffdfe2e744f54d93824fec886.jpg

三、获取构造方法

3.1 获取所有构造方法

public class Test {
    public static void main(String[] args) {
        Class<?> cls = Person.class;
        Constructor<?>[]  constructors = cls.getConstructors();  
        //Constructor<?>[] constructors = cls.getDeclaredConstructors();      //这种方式也可
        for (Constructor<?> temp: constructors
             ) {
            System.out.println(temp);
        }

    }
}

输出结果:

694a3ea36bfd71cfd953f04918255bd79bf.jpg

3.2 通过参数获取指定构造器

public class Test {
    public static void main(String[] args) {
        Class<?> cls = Person.class;
        try {
            Constructor<?>  constructor = cls.getConstructor(String.class,int.class);
            Object obj = constructor.newInstance("张三",18);
            System.out.println(obj);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果:

5ad93620e3e32dcf86125c128802618dd2f.jpg

四、反射获取普通方法

4.1 获取所有方法(包括父类)

public class Test {
    public static void main(String[] args) {
        Class<?> cls = Person.class;
        Method[] methods = cls.getMethods();
        for (Method temp: methods 
             ) {
            System.out.println(temp);
        }

    }
}

运行结果:

a88f52b6ce22424e18ed16a419eb66d205c.jpg

4.2 获取本类的所有方法

public class Test {
    public static void main(String[] args) {
        Class<?> cls = Person.class;
        Method[] methods = cls.getDeclaredMethods();
        for (Method temp: methods
             ) {
            System.out.println(temp);
        }
    }
}

运行结果:

7ffc5a5877cbb932069ee3e18e6812e0e26.jpg

4.3 根据方法名获取特定的方法

public class Test {
    public static void main(String[] args) {
        Class<?> cls = Person.class;
        try {
            Method methods = cls.getMethod("toString");
            System.out.println(methods);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
}

运行结果:

a535305e32e08913b2cdba5e2f796bc5d20.jpg

4.4 如何调用类中的setter与getter方法?

public class Test {
    public static void main(String[] args) throws Exception {
        Class<?> cls = Class.forName("com.cz.entity.Person");//反射(根据字符串类名)
        String  value  ="张三";//要设置的属性内容
        //任何情况下如果要保存类中的属相或者调用类中的方法都必须保证存在有实例化对象,既然不允许导入包,那就反射实例化
        Object obj = cls.getDeclaredConstructor().newInstance();//调用无参构造实例化
        //如果想要进行方法的调用,那么一定得获取方法的名称
        String setMethodName = "setName";//方法名称
        Method method = cls.getDeclaredMethod(setMethodName,String.class);//获取指定的方法
        method.invoke(obj,value);//等价于: Person对象的 setName(value)

        String  getMethodName = "getName";
        Method method1 = cls.getDeclaredMethod(getMethodName);
        System.out.println(method1.invoke(obj)); //等价于: Person对象的 getName()  
    }
}

 

注:初学者,写的不好请见谅,如有相关问题记得私信我

转载于:https://my.oschina.net/chenzhou/blog/2236271

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值