Java类型信息

1.模拟对象与桩:空对象的逻辑变体是模拟对象和桩。桩对象是对系统中存在的一个依赖项的可控制的替代物,桩只是返回桩数据。模拟对象主要用来做交互性测试,模拟对象被创建出来是为了处理各种不同的测试情况。

2.接口与类型信息:interface关键字的一种重要目标就是允许程序员隔离构件,进而降低耦合性。

public static void main(String[] args) {
        Person man = new Man();
        man.sleep();
        man.study();
        if (man instanceof Man) {
            Man man2 = (Man) man;
            man2.say();
        }
    }
}

interface Person {
    public void sleep();

    public void study();
}

class Man implements Person {
    public void say() {
    }

    @Override
    public void sleep() {
    }

    @Override
    public void study() {
    }
}

我们需要的是用户使用接口,但是强制转型还是可以访问不存在于接口中的方法。解决方法1是直接声明,需要使用实际的类而不是接口,则需要自己对自己负责。解决方法2是包访问权限隐藏。

public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        Class c = Class.forName("SixtyEight.Man");
        Man man = (Man) c.newInstance();
        Method[] methods = man.getClass().getDeclaredMethods();
        for (Method method : methods) {
            System.out.println(method.getName());
        }
        Method m = c.newInstance().getClass().getDeclaredMethod("say");
        m.setAccessible(true);
        m.invoke(man);
    }
}

interface Person {
    public void sleep();

    public void study();
}

class Man implements Person {
    private void say() {
        System.out.println("say()");
    }

    @Override
    public void sleep() {
    }

    @Override
    public void study() {
    }
}

通过反射,可以通用所有方法,甚至是private方法。知道方法名就可以在Method对象上调用setAccessible(true)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值