反射——创建对象、性能测试、操作泛型、操作注解

 1、动态创建对象

public class test2 {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        Class c1 = Class.forName("com.jia.util.person");

        //构建一个对象
        person p1 = (person)c1.newInstance();  //person必须要有无参构造,本质时调用类的无参构造
        System.out.println(p1);

        Constructor declaredConstructor = c1.getDeclaredConstructor(String.class); ///获取有参构造器
        person p2 = (person)declaredConstructor.newInstance("张三");//通过有参构造
        System.out.println(p2);

        //操纵方法
        Method declaredMethod = c1.getDeclaredMethod("setName", String.class);
        declaredMethod.invoke(p1,"李四");//激活  这个方法
        System.out.println(p1);

        //操作属性
        Field name = c1.getDeclaredField("name");
        name.setAccessible(true); //私有属性不能直接操作,需要关闭安全检测
        name.set(p1,"王五");
        System.out.println(p1);
    }
}

2、性能测试

  • 普通方法最短
  • 反射方式最长
  • 关闭检测可以调高使用注解的效率

3、操作泛型

  • Java采用泛型擦除的机制来引入泛型 , Java中的泛型仅仅是给编译器javac使用的,确保数据的安全性 和免去强制类型转换问题 , 但是 , 一旦编译完成 , 所有和泛型有关的类型全部擦除
  • 为了通过反射操作这些类型 , Java新增了 ParameterizedType , GenericArrayType , TypeVariable WildcardType 几种类型来代表不能被归一到Class类中的类型但是又和原始类型齐名的类型.
  • ParameterizedType : 表示一种参数化类型,比如Collection
  • GenericArrayType : 表示一种元素类型是参数化类型或者类型变量的数组类型
  • TypeVariable : 是各种类型变量的公共父接口
  • WildcardType : 代表一种通配符类型表达式
//通过反射操作泛型
public class test3 {
    public void test01(Map<String,person> map){
        System.out.println("test01");

    }
    public Map<String,person> test02(){
        System.out.println("test02");
        return null;
    }

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


        Method test01 = test3.class.getMethod("test01", Map.class);
        Type[] genericParameterTypes = test01.getGenericParameterTypes(); //获得所有输入类型
        for (Type genericParameterType : genericParameterTypes) {
            System.out.println(genericParameterType);
            if(genericParameterType instanceof ParameterizedType){    //如果时参数化类型
                Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments();//强转成真实类型
                for (Type actualTypeArgument : actualTypeArguments) {
                    System.out.println(actualTypeArgument);//输出
                }
            }
        }


        Method test02 = test3.class.getMethod("test02");
        Type genericReturnType = test02.getGenericReturnType();  //获得返回值参数类型
        if(genericReturnType instanceof ParameterizedType){   //如果时参数化类型
            Type[] actualTypeArguments = ((ParameterizedType) genericReturnType).getActualTypeArguments(); //强转成真实类型
            for (Type actualTypeArgument : actualTypeArguments) {
                System.out.println(actualTypeArgument);//输出
            }
        }

    }
}

4、操作注解

  • getAnnotations
  • getAnnotation
Object relationship Mapping --> 对象关系映射ORP
//反射操作注解
public class test4 {
    public static void main(String[] args) throws NoSuchFieldException {
        Class<student> c1    = student.class; //获得反射
        Annotation[] annotations = c1.getAnnotations(); //获得所有注解
        for (Annotation annotation : annotations) {
            System.out.println(annotation);
        }
        myclass annotation = c1.getAnnotation(myclass.class);  //获得注解
        System.out.println(annotation.value());

        Field name = c1.getDeclaredField("name");//获得注解
        myfiled annotation1 = name.getAnnotation(myfiled.class);
        System.out.println(annotation1.value());

    }

}
@myclass("类注解")
class student {

    @myfiled("属性注解1")
    private String name;
    @myfiled("属性注解2")
    private int age;



    public student() {
    }
    public student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface myclass{
    String value();
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface myfiled{
    String value();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java中,我们可以使用泛型创建一个泛型对象。具体步骤如下: 1. 定义一个泛型类或者泛型方法,使用尖括号<>来表示泛型参数,例如: ```java public class GenericClass<T> { private T value; // getter 和 setter 方法 } ``` 2. 在创建泛型对象时,需要指定泛型参数的具体类型,例如: ```java GenericClass<Integer> intObj = new GenericClass<>(); intObj.setValue(100); System.out.println(intObj.getValue()); // 输出 100 ``` 在上面的代码中,我们使用尖括号<>来指定泛型参数的具体类型为Integer,然后调用无参构造函数创建了一个泛型对象intObj,之后使用setter方法将值设置为100,最后使用getter方法获取值并输出。 需要注意的是,在Java创建泛型对象时,尖括号<>中可以指定多个泛型参数,例如: ```java public class Pair<K, V> { private K key; private V value; // getter 和 setter 方法 } Pair<String, Integer> pairObj = new Pair<>(); pairObj.setKey("count"); pairObj.setValue(10); System.out.println(pairObj.getKey() + ": " + pairObj.getValue()); // 输出 count: 10 ``` 在上面的代码中,我们定义了一个泛型类Pair,其中有两个泛型参数K和V,分别表示键和值的类型,然后使用尖括号<>来指定泛型参数的具体类型为String和Integer。之后创建了一个泛型对象pairObj,使用setter方法将键和值设置为"count"和10,最后使用getter方法获取键和值并输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

上兵伐眸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值