Java:反射、注解、泛型

水深无声 2024-03-16 13:14 121阅读 0赞

一、反射

作用:做一般做不到的事情

使用场景:插件换肤、插件式开发

所有反射功能都是基于class字节码,包含三个部分

  • Filed:属性
  • Constructor:构造函数
  • method:方法
  1. public class TestBean {
  2. private String name="xiaoming";//属性
  3. public TestBean(String name,int age){// 构造函数
  4. this.name = name;
  5. }
  6. public void sysName(){//方法
  7. Log.e("TAG",name);
  8. }
  9. private void say(String desc){
  10. Log.e("TAG",name + " : "+desc);
  11. }
  12. }

构造方法调用

  1. try {
  2. Constructor<TestBean> constructor = TestBean.class.getDeclaredConstructor(String.class, int.class);
  3. constructor.setAccessible(true);
  4. TestBean testBean = constructor.newInstance("名称", 18);
  5. testBean.sysName();
  6. } catch (Exception e) {
  7. e.printStackTrace();
  8. }

TestBean testBean = TestBean.class.newInstance(参数类型);

getDeclaredConstructor 从所有的构造方法中找
getConstructor 从公共构造方法中去找

constructor.setAccessible(true);//设置权限

方法调用

  1. Method method = TestBean.class.getDeclaredMethod("say",String.class);
  2. method.setAccessible(true);
  3. method.invoke(constructor,"描述信息");

属性调用

  1. Field field = TestBean.class.getDeclaredField("name");
  2. field.setAccessible(true);
  3. String name = (String) field.get(testBean);

二、注解

注解只是一个标识,没有具体的功能

  1. @Target(ElementType.FIELD)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. public @interface ViewById {// @interface 代表注解
  4. int value();
  5. }

@Target:放在哪个位置

  • ElementType.METHOD:作用于方法
  • ElementType.Type:作用于类
  • ElementType.Field:作用于属性

@Retention:

  • RetentionPolicy.RUNTIME:运行时,如:xUtils
  • RetentionPolicy.CLASS:编译时(打包时),如:ButterKnife
  • RetentionPolicy.SOURCE:编程时

注解结合反射解决findViewById注入

  1. public class ViewUtils {
  2. public static void inject(Activity activity) {
  3. // 1.获取所有的属性
  4. Field[] fields = activity.getClass().getDeclaredFields();
  5. // 2.过滤关于 ViewById 属性
  6. for (Field field : fields) {
  7. ViewById viewById = field.getAnnotation(ViewById.class);
  8. if(viewById != null){
  9. // 3.findViewById
  10. View view = activity.findViewById(viewById.value());
  11. // 4.反射注入
  12. field.setAccessible(true);
  13. try {
  14. // activity 属性所在类,view 代表的是属性的值
  15. field.set(activity,view);
  16. } catch (IllegalAccessException e) {
  17. e.printStackTrace();
  18. }
  19. }
  20. }
  21. }
  22. }

三、泛型

类泛型:在任何地方出现的,代表的是同一类型

方法泛型:作用在方法上

上限:类名<? extends 类> 对象名称 类和其子类

下限:类名<? super 类> 对象名称 类和其父类

发表评论

表情:
评论列表 (有 0 条评论,121人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java反射操作接口

    通过反射获取到抽象类或者接口中泛型信息的操作也是很常见的。实际上开发中,解析后台数据的Json数据,生成对应的泛型实体类,会用到反射获取泛型信息的操作。 实战案例 ----