Java高级之反射

关于反射的举例:
在这里插入图片描述

示例代码:Fan.java

package testFanShe;

/**
 * @author: Arbicoral
 * @Description: 测试反射:
 *                  成员变量:2个public,2个private
 *                  构造器:4个public,2个private
 *                  成员方法:1个private,1个public
 */
public class Fan {
    private String name;
    private int age;
    public String address;
    public String say;

    public Fan() {}

    private Fan(String name) {this.name = name;}
    public Fan(String address, String name) {this.address = address;this.name = name;}

    private Fan(boolean isMarried,String address){
        this.address=address;
    }
    public Fan(String name, int age) {this.name = name;this.age = age;}

    public Fan(String name, int age, String address, String say) {
        this.name = name;
        this.age = age;
        this.address = address;
        this.say = say;
    }

    public void show(){
        System.out.println("我是反射...");
    }

    private void run(){
        System.out.println("running...");
    }
}

通过反射获取 Fan.java中的成员变量、成员方法、构造器等成分。

TestFan.java

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Member;
import java.lang.reflect.Method;

/**
 * @author: Arbicoral
 * @Description: 测试 Fan类
 */
public class TestFan {
    private static Class<Fan> fanClass;

    public static void main(String[] args) throws Exception {
        // -------------- 一、获取Class对象的三种方式:Class对象---------------------
        // 方式 1.获取class对象
        fanClass = Fan.class;
        // 方式 2. 调用Class提供的方法:public static Class<?> forName(String className)
        Class<?> aClass = Class.forName("testFanShe.Fan");
        // 方式 3. Object提供的方法:public final native Class<?> getClass();
        // Class c3=对象.getClass();
        Fan fan = new Fan();
        Class<? extends Fan> aClass1 = fan.getClass();


        // -------------- 二、获取类的构造器:Constructor对象---------------------
        // 2.获取全部public构造器
        Constructor<?>[] constructors = aClass.getConstructors();
        for (Constructor constructor:constructors){
            // 获取构造器的名字和构造器中参数的个数
            System.out.println(constructor.getName()+"-->"+constructor.getParameterCount());
        }
        System.out.println("=============");
        // 3.获取所有构造器,无论是否是public
        Constructor<?>[] declaredConstructors = fanClass.getDeclaredConstructors();
        for (Constructor dc:declaredConstructors){
            System.out.println(dc.getName()+"-->"+dc.getParameterCount());
        }
        System.out.println("********************");
        // 4. 根据参数获取public构造器
        Constructor constructor = fanClass.getConstructor(String.class, int.class);
        System.out.println(constructor.getName()+"-->"+constructor.getParameterCount());

        System.out.println("-----------------");
        // 5. 根据参数获取所有构造器,无论是否是public
        Constructor<Fan> dc = fanClass.getDeclaredConstructor(boolean.class, String.class);
        dc.setAccessible(true);
        // dc.newInstance();
        System.out.println(dc.getName()+"-->"+dc.getParameterCount());
        System.out.println("********************");

        // -------------- 三、获取类的成员变量:Field对象---------------------
        // 获取全部public的成员变量
        Field[] fields = fanClass.getFields();
        for (Field f:fields){
            System.out.println(f.getName());
        }
        System.out.println("********************");
        // 获取所有的成员变量,无论是否是public
        Field[] declaredFields = fanClass.getDeclaredFields();
        for (Field f:declaredFields){
            System.out.println(f.getName());
        }

        // -------------- 四、获取类的成员方法:Method对象---------------------
        // 获取全部public的成员方法
        System.out.println("********************");
        Method[] methods = fanClass.getMethods();
        for (Member m:methods){
            System.out.println(m.getName());
        }
        System.out.println("********************");
        for (Method declaredMethod : fanClass.getDeclaredMethods()) {
            System.out.println(declaredMethod.getName());
        }

    }
}

总结:

反射的作用:

  1. 基本作用:可以得到一个类的全部成分,然后进行操作;
  2. 可以破坏封装性;
  3. 适合做Java框架,基本上,主流的框架都会基于反射设计一些通用的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值