Java中的反射和注解

反射

  反射是将类抽象为一个Class对象。将类看成对象,分析它的构造方法,成员变量,方法以及内部类。 
  对类的分析,是将类抽象为Class对象;对构造方法的分析,是将构造方法抽象为Constructor类的对象;对成员变量的分析,是将变量抽象为Feild类的对象;对方法的分析,是将方法抽象为Method类的对象。 
举个例子:

 1 public class Student {
 2     public String name;//定义学生姓名
 3     private int age;//定义学生年龄
 4     private String sex;//定义学生性别
 5     //获得学生姓名的方法
 6     public String getName() {
 7         return name;
 8     }
 9     //学生姓名赋值的方法
10     public void setName(String name) {
11         this.name = name;
12     }
13     //获得学生年龄的方法
14     public int getAge() {
15         return age;
16     }
17     //注意,这里没有为学生年龄赋值的方法,学生年龄为私有类型。
18
19     //获得学生性别的方法
20     public String getSex() {
21         return sex;
22     }
23     //学生性别赋值的方法
24     public void setSex(String sex) {
25         this.sex = sex;
26     }
27 }
 1 public class Test {
 2     public static void main(String[] args) {
 3         Class<Student> clazz =Student.class;
 4         try {
 5             /Class Field   Method的使用。
 6
 7             //获得Student类的name属性对象。
 8             Field field1  = clazz.getDeclaredField("name");
 9             //返回name字段的修饰符
10             System.out.println(field1.getModifiers());
11             //返回name字段的类型
12             System.out.println(field1.getType());
13             //返回name字段的名称
14             System.out.println(field1.getName());
15             //获得Student类的所有属性对象。
16             Field[] field2 = clazz.getDeclaredFields();
17             //遍历所有属性
18             for (Field field : field2) {
19                 System.out.println(field.getName());
20                 System.out.println(field.getType());
21                 System.out.println(field.getModifiers());
22             }
23
24             //为学生对象zhangsan没有set方法的私有类型age赋值
25             Student zhangsan = new Student();
26             //获得age属性的对象
27             Field age = clazz.getDeclaredField("age");
28             //取消对age属性的修饰符的检查访问,以便为age属性赋值
29             age.setAccessible(true);
30             //为age属性赋值
31             age.set(zhangsan, 18);
32             //回复对age属性的修饰符的检查访问
33             age.setAccessible(false);
34             System.out.println(zhangsan.getAge());
35
36             //Method 的使用
37             Method method1= clazz.getDeclaredMethod("getName");
38             System.out.println(method1.getModifiers());

注解(Annotation)

注解的定义形式:

1  @interface 注解名{
2     <成员类型> <成员名称>() default "<默认值>";
3     ……
4  }

下面这个例子定义了一个注解,注解名为MyAnotation,注解包含一个成员是int型的value()。@Retention表示注解的应用范围,注解的应用范围通常用RetentionPolicy中的枚举常量表示,这个例子中用的RetentionPolicy中的RUNTIME常量,表示在运行时加载注解到虚拟机,有效的范围最大。@Target表示次注解适用于变量类型,并且可为int类型的变量赋值。

此图片摘自博客园的……@黑色幽默Lion

1 @Retention(RetentionPolicy.RUNTIME)
2 @Target(ElementType.FIELD)
3 public @interface MyAnotation {
4     int value();
5 }
 1 import java.lang.reflect.Field;
 2
 3 public class Student {
 4     private String name;
 5     @MyAnotation(value =18)
 6     private int age;
 7     Student(){
 8         Class clazz = Student.class;
 9         try {
10             //获取age属性对象
11             Field field = clazz.getDeclaredField("age");
12             //创建注解对象,获取age属性的注解
13             MyAnotation ma = field.getAnnotation(MyAnotation.class);
14             //判断获得的注解对象是否为空
15             if(ma!=null){
16                 //为age赋值
17                 int i = ma.value();
18                 field.setAccessible(true);
19                 field.set(this, i);
20                 field.setAccessible(false);
21             }
22         } catch (NoSuchFieldException | SecurityException e) {
23             // TODO Auto-generated catch block
24             e.printStackTrace();
25         } catch (IllegalArgumentException e) {
26             // TODO Auto-generated catch block
27             e.printStackTrace();
28         } catch (IllegalAccessException e) {
29             // TODO Auto-generated catch block
30             e.printStackTrace();
31         }
32     }
33     public String getName() {
34         return name;
35     }
36     public void setName(String name) {
37         this.name = name;
38     }
39     public int getAge() {
40         return age;
41     }
42     public void setAge(int age) {
43         this.age = age;
44     }
45 }

原文地址:https://www.cnblogs.com/univalsoft-mobile-team/p/8297381.html

时间: 2024-11-14 11:54:14

Java中的反射和注解的相关文章

java中利用反射机制绕开编译器对泛型的类型限制

首先看下面这个例子 public static void main(String[] args) { ArrayList<Integer> al1 = new ArrayList<Integer>(); al1.add(1); ArrayList<String> al2 = new ArrayList<String>(); al2.add("hello"); //int型链表和string型链表,结果为true System.out.pr

Java中的反射——(1)什么是反射

Java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是Class. public class ReflectTest { public static void main(String[] args) throws ClassNotFoundException { String str1 = "abc"; Class cls1 = String.class; Class cls2 = str1.getClass(); Class cls3 = Class.forNa

浅说Java中的反射机制(二)

写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编译执行java文件时,会生成一个.class文件,反射就是一个反编译的过程,它可以通过.class文件得到一个java对象.一个类会有很多组成部分,比如成员变量.成员方法.构造方法等,反射可以通过加载类(加载类是个什么东西?一直搞不清楚),解剖出类的各个组成部分. 为什么要用反射? 我们需要访问一个

JAVA中的反射只获取属性的get方法

JAVA中的反射只获取属性的get方法 在开发过程中,我们经常需要获取类中某些属性的get方法,此时我们需要使用到反射,例如,我们在获得一个对象后,需要知道该对象的哪些属性有值,哪些没有值,方便我们后面的处理. 譬如在我们拼SQL语句时,就需要知道哪些字段为空或为NULL,此时我们在拼语句的时候需要剔除掉,若是我们采用一般的判断的办法,则会很复杂(需要处理好SQL中的AND关键字的有无 ),当然,我们也有另外的解决办法(例如将非空的键和值存入map中,再将map存入list集合中,然后循环集合做

关于JAVA中的反射机制的总结

JAVA中的反射机制是一种能够大大增强程序扩展性的技术.当一个程序封装完成后(生成exe文件),如果想要对该程序进行功能扩展,不用进行代码的从新修改(也不可能拿到源码),只要修改配置文件(一般是XML)就可以完成. 这样的程序为外部提供了一个接口,只要按照该接口的规则定义一个对象(功能),即可以为应用程序扩展该功能. 可以这样比喻,你买了一块电脑主板(封装好的程序),此时你想要添加一块声卡(要扩展的功能),此时只能够通过一个pci接口(应用程序提供的接口)来进行扩展.声卡的接口必须符合PCI的规

Java 中的反射机制

一.什么是Java中的反射: Reflection 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性和方法.Java 的这一能力在实际应用中用得不是很多,但是在其它的程序设计语言中根本就不存在这一特性.例如,Pascal.C 或者 C++ 中就没有办法在程序中获得函数定义相关的信息.Reflection 是 Java 被视为动态(或准动态)语言的关键,允许程序于执行期 Reflection APIs 取得任何已知名称之

java中使用反射获取pojo(实体)类的全部字段值

说起反射.不得不说它实在是太强大了,通过反射就能够轻轻松松拿到各种东东,假设你想在项目中解除对某个类的依赖,能够考虑用反射. 今天跟大家分享的是通过java中的反射,获取pojo类的全部字段值. 为什么要做这个操作的呢?主要是为了重写实体类的toString方法.有人会说.直接重写toString方法.返回字段.toString()的字符串不就可以了. 这么做的确能够.可是假设你的pojo类有上百个,上千个,你还要一个一个改吗?所以我们须要从新的方向去解决. 由于我们全部的pojo类.都继承一个

java中的反射机制在Android开发中的用处

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制.      然而在android中Google很多的类的某些方法不让第三方应用去调用,通过java反射机制能把这些隐藏方法获取出来并调用,三方应用上我们就很方便的去用这些方法.      例如我们需要安全的杀死某个应用的服务和进程调用ActivityManager.forceStopPack

黑马程序员【java中的反射机制】

Java中的反射机制 ------- android培训.java培训.期待与您交流! ---------- java的反射机制是java的特性之一,反射机制是构建框架技术的基础所在,使用反射可以使程序更加灵活,避免将程序写死在代码里.相对于很多初学者只接触过java基础的人,反射还是一个很朦胧难懂的概念,下面我们就来说一下反射的一些应用. java反射机制是指在运行状态中,动态获取信息以及动态调用对象方法的功能.java反射有3个动态性质:1.运行时生成对象实例,2.运行期间调用发放,3.运行