初步探索Java反射

定义一个产品类Card,私有字段,私有方法

java

package redgo.beans;

public class Card {

    private String brand; //车的品牌
    private String num; //车号
    private String color; //车的颜色

    public Card(){
        brand = "大众";
        num = "Gk0661";
        color = "红色";
    }

    public Card(String brand, String num, String color){
        this.brand = brand;
        this.num = num;
        this.color = color;
    }

    void setColor(String color){ //设置颜色
        this.color = color;
    }

    private void fix(){
        System.out.println("开始修车");
        report();
    }

    private void report(){
        System.out.println("报告:修车完毕");
    }

    @Override
    public String toString() {
        return "Card [brand=" + brand + ", num=" + num + ", color=" + color + "]";
    }
}

下面测试如何调用当前运行类,指定类对象及其内部字段、构造方法、方法等

java

package redgo.test;

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

import redgo.beans.Card;

public class CardReflect {

    public static void main(String[] args) throws Exception{

        System.out.println("-------获取Card类--------\n");
        Class c = Class.forName("redgo.beans.Card"); //根据包名+类名获取类对象
        Card card = (Card)c.newInstance();  //用默认构造方法创建对象
        Method[] method = c.getDeclaredMethods(); //获取类声明的所有方法,不包括继承得来的
        Field[] field = c.getDeclaredFields(); //获取类声明的所有字段
        Constructor[] constructor = c.getDeclaredConstructors(); //获取类声明的所有构造方法

        System.out.println(">>运行类对象声明的fix()方法");
        Method fix_method = c.getDeclaredMethod("fix");
        fix_method.setAccessible(true); //允许调用private方法
        fix_method.invoke(c.newInstance());//第一个参数为类的实例
        System.out.println(">>运行结束\n");

        System.out.println(">>利用指定构造方法创建对象");
        Constructor con = c.getConstructor(String.class, String.class, String.class);
        Card card_another = (Card)con.newInstance("奔驰", "JK897", "蓝色");
        System.out.println(card_another.toString());
        System.out.println(">>创建对象完毕\n");

        System.out.println("-------获取当前类--------");
        System.out.println("getClassForStatic()方法输出结果:" + getClassForStatic().getName());
        System.out.println("getClassNameForStatic()方法输出结果:" + getClassNameForStatic());
    }

    /**
     * 利用匿名类在静态方法中获取当前类,弥补静态方法中不能用this.getClass()的不足
     */
    private static Class getClassForStatic() {
        return new Object(){
            public Class getClassForStatic(){ 
                return this.getClass();
            }
        }.getClassForStatic();
    }

    /**
     * 利用匿名类静态方法获取当前类名
     */
    private static String getClassNameForStatic(){
        return new Object(){
            public String getClassNameForStatic(){
                String className = this.getClass().getName();
                return className.substring(0, className.lastIndexOf('$'));
            }
        }.getClassNameForStatic();
    }
}

输出结果
——-获取Card类——–

>>运行类对象声明的fix()方法
开始修车
报告:修车完毕
>>运行结束

>>利用指定构造方法创建对象
Card [brand=奔驰, num=JK897, color=蓝色]
>>创建对象完毕

——-获取当前类——–
getClassForStatic()方法输出结果:redgo.test.CardReflect$1
getClassNameForStatic()方法输出结果:redgo.test.CardReflect

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值