Java类型信息

1.类方法提取器:Class的getMethods()和getConstructors()方法分别返回Method对象的数组和Constructor对象的数组。使用toString()可以生成一个含有完整的方法特征签名的字符串。使用indexOf()可以判断某个特定签名是否与我们的目标字符串相符。

public static void main(String[] args) {
    getPackageName("SixtySix.Test12");
}

private static void getPackageName(String packageName) {
    try {
        Class clazz = Class.forName(packageName);
        Method[] methods = clazz.getMethods();
        for (Method method : methods) {
            String methodName = method.getName();
            System.out.println("方法名称:" + methodName);
        }
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}

2.动态代理:代理是基本的设计模式之一,它是你为了提供额外的或不同的操作,而插入的用来代替实际对象的对象。通过调用静态方法Proxy.newProxyInstance()可以创建动态代理,需要得到一个类加载器,以及InvocationHandler接口的实现。invoke()实现对真实角色的代理访问。

interface A {
    void study();

    void play();
}

class B implements A {

    @Override
    public void study() {
        System.out.println("B.study()");
    }

    @Override
    public void play() {
        System.out.println("B.play()");
    }
}

class C implements InvocationHandler {
    A realA;

    public C(A realA) {
        this.realA = realA;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        method.invoke(realA, args);
        return null;
    }
}

public class Test2 {
    public static void main(String[] args) {
        A a = new B();
        C c = new C(a);
        A a1 = (A) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{A.class}, c);
        a1.study();
    }
}

3.空对象:空对象并非拥有真实的值,但它拥有真实对象的行为。instanceof可以检测空对象,不需要在所有的类中都添加 isNull()方法。使用单例可以直接使用equals.(类名.NULL)或==类名.NULL 。

abstract class A1 {
    protected String name;

    public abstract boolean isNil();

    public abstract String getName();
}

class B1 extends A1 {
    public B1(String name) {
        this.name = name;
    }

    @Override
    public boolean isNil() {
        return false;
    }

    @Override
    public String getName() {
        return name;
    }
}

class C1 extends A1 {

    @Override
    public boolean isNil() {
        return true;
    }

    @Override
    public String getName() {
        return "Not Find";
    }
}

class D1 {
    public static final String[] names = {"Tom", "Cindy", "Anna"};

    public static A1 a(String name) {
        for (int i = 0; i < names.length; i++) {
            if (names[i].equalsIgnoreCase(name)) {
                return new B1(name);
            }
        }
        return new C1();
    }
}

public class Test3 {
    public static void main(String[] args) {
        A1 a1 = D1.a("Tom");
        A1 a2 = D1.a("Rob");
        A1 a3 = D1.a("Anna");
        A1 a4 = D1.a("Julie");
        System.out.println(a1.getName());
        System.out.println(a2.getName());
        System.out.println(a3.getName());
        System.out.println(a4.getName());
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值