Java反射-调用构造方法、获取继承关系、动态代理

一、调用构造方法

1、通过Class类提供的newInstance()方法可以实例化一个类

Person p = Person.class.newInstance();
//局限性在于 实例化只能调用 public属性的 无参构造方法

2、通过构造器来调用构造方法 Constructor 对象

  • getConstructor(Class...):获取某个publicConstructor
  • getDeclaredConstructor(Class...):获取某个Constructor
  • getConstructors():获取所有publicConstructor
  • getDeclaredConstructors():获取所有Constructor

注意:Constructor总是调用当前类的构造方法,不存在多态的问题;调用非publicConstructor时,必须首先通过setAccessible(true)设置允许访问。setAccessible(true)可能会失败。

import java.lang.reflect.Constructor;
public class GetConstructor {
    public static void main(String[] args) throws Exception {
        System.out.println("-----------测试使用Constructor构造器------------");
        Constructor c1 = Integer.class.getConstructor(String.class); //接受的参数类型是Class类
        Integer i = (Integer) c1.newInstance("123");
        System.out.println(i);
    }
}

二、获取继承关系

在Class类中提到过,获取Class类有三种方法,同时注意JVM对于每个加载的Class只创建一个Class实例,因此下面三种方式获取到的是一个Class类:

  • getClass()方法获取
  • forName(参数:完全限定名)方法获取
  • class属性获取

1、获取父类的Class getSuperclass()

2、获取所有实现的接口的Class getInterfaces(),只能获取当前类实现的接口,不能获得父类实现的接口

3、通过Class对象的isAssignableFrom()方法可以判断一个向上转型是否可以实现

public class GetExtend {
    public static void main(String[] args) {
        System.out.println("------------测试通过反射获取继承------------");
        Class c1 = Integer.class;
        //获取父类的Class, 因此还是Class类
        Class sc1 = c1.getSuperclass();
        System.out.println(sc1);
        //获取当前类实现的接口
        Class[] i = c1.getInterfaces();
        System.out.println(i.length);
        for(Class j : i){
            System.out.println(j);
        }
        // 通过 isAssignableFrom 判断向上转型是否成功
        System.out.println(Integer.class.isAssignableFrom(Number.class));  //False
        //Number对象 转到Integer 是向下转型,所以结果为False
        System.out.println(Number.class.isAssignableFrom(Integer.class));
    }
}

三、动态代理

主要通过 Proxy.newProxyInstance()来实现,动态代理相对于静态而言,指的是在运行期间,创建某个 interface实例

package reflect;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
/**
* @className:DynamicProxy;
* @time:2022-05-19-20:36;
* @author:Lee Ye;
* @description:这是一个java示例;
*/
public class DynamicProxy {
   public static void main(String[] args) {
       InvocationHandler handle = new InvocationHandler() {
           @Override
           public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
               System.out.println(method);
               if (method.getName().equals("morning")){
                   System.out.println("Good morning");
                   System.out.println(args.length);
                   for(Object i: args){
                       System.out.println(i);
                   }
               }
               return null;
           }
       };
       Hello hello = (Hello) Proxy.newProxyInstance(
               Hello.class.getClassLoader(),
               new Class[]{Hello.class},
               handle
       );
       hello.morning("3ackr0d");

   }

}
interface Hello{
   void morning(String name);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值