反射:

反射, 主要是指通过类加载, 动态的访问, 检测和修改类本身状态或行为的一种能力, 并能根据自身行为的状态和结果, 调整或修改应用所描述行为的状态和相关的语义。
 
反射操作核心的概念“一切的操作都将使用Object完成, 类、 数组的引用都可以使用Object进行接收”
 
 实例化类对象的方式。 
 1。 Class<?> c1 = Class . for Name( " 完整的类路径")  常用
 2。 Class<?>c2 =类名.class
 3。 Class<?>c3 =new 类名( ).getClass( )
 
Class 类常用操作
 getSimpleName()获取类名
getName()获取完整的“包,类”名称;
Class 类的使用
无参构造实例化对象
public static void main(String[] args) throws ClassNotFoundException, InstantiationException,
IllegalAccessException {
//通过类路径获取类Class对象
Class<?> clazz = Class.forName("com.project.enmutestdemo.fanshe.Person");
//调用newInstance()方法, 调用无参构造创建类对象
Person person = (Person) clazz.newInstance();
//操作对象
person.setAge(12);
person.setName("张三");
System.out.println(person);
}
有参构造实例化对象
public static void main(String[] args) throws ClassNotFoundException,
InstantiationException, IllegalAccessException,
IllegalArgumentException, InvocationTargetException {
//获取类的Class对象
Class<?> clazz =clazz.forName("com.project.enmutestdemo.fanshe.Person");
//通过参数类型获取类的具体的某一个构造器
Constructor<?> c = clazz.getConstructor(String.class,int.class);
Person person = null;
// 传入实参, 通过构造器创建类对象
person = (Person) c.newInstance("张三", 20);
System.out.println(person);
Constructor 构造器类 常用的方法 
Field 类常用方法 
 getmodified  获取访问修饰符(public private 。。。)
取得类中属性
public static void main(String[] args) throws ClassNotFoundException {
Class<?> clazz = null;
//通过类路径获取类Class对象
clazz = Class.forName("com.project.enmutestdemo.fanshe.Person");
//取得本类的属性
Field[] f = clazz.getDeclaredFields();
//循环操作类的属性
for(int i = 0; i < f.length; i++){
//取得该属性的类型
Class<?> t = f[i].getType();
//取得该属性的修饰符数字
int mo = f[i].getModifiers();
//通过修饰符数字取得属性的修饰符
String priv = Modifier.toString(mo);
System.out.print("本类属性: ");
System.out.print(“ 修饰符为: ”+priv+" ");
System.out.print(“类型为: ”+t.getName()+" ");
System.out.print(“名称为: ”+f[i].getName()+”\n”); 通过反射 操作属性
//获取类的Class对象
Class<?> clazz = Class.forName("com.project.enmutestdemo.fanshe.Person");
//调用无参构造器创建类对象
Object obj = clazz.newInstance();
//通过属性名称获取属性的Field对象
Field nameFiled = clazz.getDeclaredField("name");
//通过set方法对对象的属性进行赋值
nameFiled.set(obj, "张三");
//通过get方法获取对象的属性值
System.out.println(" 姓名: "+nameFiled.get(obj)); 操作类中的属性
//获取类的Class对象
Class<?> clazz = Class.forName("com.project.enmutestdemo.fanshe.Person");
//调用无参构造器创建类对象
Person obj = clazz.newInstance();
//通过属性名称获取属性的Field对象
Field nameFiled = clazz.getDeclaredField("name");
//设置该属性的访问权限为可访问
nameFiled.setAccessible(true);
//通过set方法对对象的属性进行赋值
nameFiled.set(obj, "张三");
//通过get方法获取对象的属性值
System.out.println(" 姓名: "+nameFiled.get(obj));
 
Method 类常用方法
 取得类的全部方法
//获取类的Class对象
Class<?> clazz = Class.forName("com.project.enmutestdemo.fanshe.Person");
Method[] method = clazz.getDeclaredMethods();//获取本类所有方法
for(int i = 0; i < method.length;i++){//循环操作方法
Class<?> r = method[i].getReturnType();//获取方法的返回值类型
Class<?> p[] =method[i].getParameterTypes();//获取方法的参数类型
int xx = method[i].getModifiers();//获取方法的修饰符数字
System.out.print(Modifier.toString(xx)+" ");//获取修饰符
System.out.print(r.getSimpleName()+" ");//获取方法返回值类型名称;
System.out.print(method[i].getName());//获取方法名称
System.out.print("(");
for(int x = 0; x < p.length;x++){//循环操作参数类型
System.out.print(p[x].getSimpleName() +" "+ "arg"+x);//输出参数
if(x < p.length -1){//判断是否输出“ , ”
System.out.print(",");//输出“ , ”
}
}S
ystem.out.println();//换行
}
调用类中的方法
public static void main(String[] args) throws ClassNotFoundException,
NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException,
InvocationTargetException, InstantiationException {
//获取类的Class对象
Class<?> clazz = Class.forName("com.project.enmutestdemo.fanshe.Person");
//通过方法名称获取无参Method对象
Method me = clazz.getMethod("speak");
//调用无参构造器创建类对象
Object obj = clazz.newInstance()
me.invoke(obj);
利用反射,在控制台输出以下信息:
public class UserPo{
private int id;
private String userName;
private String userPass;
}
 
 
 

注解:

 给程序 看的注释,  称为 注解(Annotation)    是代码里的特殊标记,可以在编译,类加载,运行时被读取,并执行相应的处理。 通过使用注解,可以在不改变原有的逻辑的情况下,在源文件嵌入一些补充的信息。
 Annotation  提供为程序元素 (包,类,构造器,方法,成员变量,参数,局部变量)设置 元数据的方法 , 它不能运行,只有成员变量,没有方法,跟修饰符一样地位
  
 基本 Annotation :
@Override 限定重写父类方法,如果存在,则正确,反之 ,报错
@Deprecated 表示某个程序或元素 已过时。
@SuppressWaring:抑制编译器警告;
@SafeVarargs:是JDK7专门为抑制“堆污染”警告提供的;
 
自定义 注解 
定义新的Annotation 类型使用@interface 关键字,例如
Public  @interface Table{  
}
 
使用 Annotation   一般会放在另一行,并且放在修饰符之前,如
@Table  
public class Myclass{ 
。。。。
}
 成员变量声明 
1  无形参的方法
  public @interface MyTag { 
         string name();
           int age ();
}
2   指定默认值  在指定成员变量时,使用default 关键字  
 public @interface MyTag{ 
  string name ()default “ 张三” ;
 int age ()  default 18;
}
 
成员变量的使用方式 
1  无形参方法声明时
 public class AnnonationTest{
  @MyTag ( name = "张三",age=30)
public void info(){
...
}
}
2  默认值声明变量时 
 public class AnnonationTest{
  @MyTag 
public void info(){
}
}
 
Annoation 分类  
  根据 Annotation 是否包含成员变量, 我们把其分为两类
1  没有成员变量的: 标记Annotation  仅用自身的存在与否提供信息 如重写
2 包含成员变量的: 元数据 Annotation 
 
 
元注解 (注解的注解)
 @Retention  : 用于指定 Annotation 可以保留多长时间
@Target :  指定 Annotation 用于修饰那些元素
@Documented: 用于被修饰的Annotation类将被javadoc工具提取成文档,
默认情况下,javadoc是不包括注解的。
@Inherited:指定Annotation具有继承性;
 
@Retention(RetentionPolicy.RUNTIME)//元注解
@Target(ElementType.TYPE)//元注解   都是修饰下面的Table 自定义注解的注解
public @interface Table { // 自定义注解
        String name(); 
}
@Column(name = "name")
    String name;
    @Column(name = "age")
    int age; 
 注解同public 地位一样,同属性绑在一起,可以通过反射Field(属性)操作注解 
 
@Retention
 包含一个名为value 的成员变量 , 是RetentionPolicy枚举类型 值如下 
RetentionPolicy.SOURCE:Annotation只保留在源代码中,编译器编译时,
直接丢弃这种Annotation;
RetentionPolicy.RUNTIME:编译器把Annotation记录在class文件中。当运行java程序时,JVM会保留该Annotation,程序可以通过反射获取该Annotation的信息;
RetentionPolicy.CLASS:编译器把Annotation记录在class文件中。当运行
java程序时,JVM中不再保留该Annotation;
 
@Target
包含一个名为“value”的成员变量, 该value成员变量类
型为ElementType[],ElementType为枚举类型, 其值为:
ElementType.TYPE:能修饰类、接口或枚举类型;
ElementType.FIELD:能修饰成员变量;
ElementType.METHOD:能修饰方法;
ElementType.PARAMETER:能修饰参数;
ElementType.CONSTRUCTOR:能修饰构造器;
ElementType.ANNOTATION_TYPE:能修饰注解;
ElementType.LOCAL_VARIABLE:可用于局部变量上
ElementType.PACKAGE:用于记录java文件的package信息
 
提取Annotation 信息
JDK主要提供两个类, 来完成Annotation的提取:
java.lang.annotation.Annotation接口:所有 annotation 类型都要扩展的公共接口;
java.lang.reflect.AnnotatedElement接口:该接口允许反射性地读取注解。
 
java.lang.reflect.AnnotatedElement接口
isAnnotationPresent(Class<? extends Annotation> annotationClass):判断该程序元素上是否存在指定类型的注解,如果存在则返回true,否则返回false;
getAnnotation(Class<T> annotationClass):返回该程序元素上存在的指定
类型的注解,如果该类型的注解不存在,则返回null;
Annotation[] getAnnotations():返回该程序元素上存在的所有注解;
Annotation[] getDeclaredAnnotations() :返回直接存在于此元素上的所有注解。
 
通过反射取得Annotation
 
取得指定的Annotation ; 
 

JAVA高级特性反射和注解的更多相关文章

  1. Java高级特性——反射机制(第二篇)

    在Java高级特性——反射机制(第一篇)中,写了很多反射的实例,可能对于Class的了解还是有点迷糊,那么我们试着从内存角度去分析一下. Java内存 从上图可以看出,Java将内存分为堆.栈.方法区 ...

  2. Java高级特性——反射机制(完结)——反射与注解

    按照我们的学习进度,在前边我们讲过什么是注解以及注解如何定义,如果忘了,可以先回顾一下https://www.cnblogs.com/hgqin/p/13462051.html. 在学习反射和注解前, ...

  3. Java高级特性——反射机制(第三篇)

    获取类运行时的结构 通过反射获取运行时类的完整结构 Field.Method.Constructor.Superclass.Interface.Annotation >实现的全部接口 >所 ...

  4. Java高级特性——反射

    感谢原文作者:peter_RD_nj 原文链接:https://www.jianshu.com/p/9be58ee20dee 注意:同一个类在JVM中只存在一份字节码对象 概述 定义 JAVA反射机制 ...

  5. Java高级特性——反射机制(第一篇)

    ——何为动态语言,何为静态语言?(学习反射知识前,需要了解动态语言和静态语言) 动态语言 >是一类在运行时可以改变其结构的语言,例如新的函数.对象.甚至是代码可以被引进,已有的函数可以被删除或者 ...

  6. Java高级篇反射和注解

    反射是什么? 反射的作用?能带来什么好处? 反射的使用? 注解的使用? 注解和反射配合实战...

  7. Java高级特性—反射和动态代理

    1).反射 通过反射的方式可以获取class对象中的属性.方法.构造函数等,一下是实例: 2).动态代理 使用场景: 在之前的代码调用阶段,我们用action调用service的方法实现业务即可. 由 ...

  8. Java 高级基础——反射

    Java 高级基础--反射 反射的意义:Java 强类型语言,但是我们在运行时有了解.修改信息的需求,包括类信息.成员信息以及数组信息. 基本类型与引用类型 基本类型,(固定的 8 种) 整数:byt ...

  9. java高级特性增强

    第4天 java高级特性增强 今天内容安排: 1.掌握多线程 2.掌握并发包下的队列 3.了解JMS 4.掌握JVM技术 5.掌握反射和动态代理 java多线程增强 .1. java多线程基本知识 . ...

随机推荐

  1. Mongodb for PHP教程之数据操作

    Mongodb的常用操作 参看手册,php官方的http://us2.php.net/manual/en/mongo.manual.php 也可以参看mongodb官方的教程 数据库连接 ⑴默认格式 ...

  2. exadata(ilom) 练习

    Oracle(R) Integrated Lights Out Manager Version 3.0.16.10 r65138 Copyright (c) 2011, Oracle and/or i ...

  3. 遍历数据库全部表,将是datetime类型的列的值进行更新

    declare @tablename nvarchar(80)   declare @cloumn nvarchar(80)   declare @sql nvarchar(400) declare ...

  4. Android耳机线控具体解释,蓝牙耳机button监听(仿酷狗线控效果)

    转载请注明出处:http://blog.csdn.net/fengyuzhengfan/article/details/46461253 当耳机的媒体按键被单击后.Android系统会发出一个广播.该 ...

  5. web.xml中的ServletContextListener

    要想了解ServletContextListener,先看看web.xml中的<listener>配置. 一)web.xml中的内容载入顺序: 首先能够肯定的是,载入顺序与它们在 web. ...

  6. VUEX action解除页面耦合

    最近项目中需要用到vue+vuex来实现登出跳转功能,老大指派任务要用action解除页面耦合,刚从vue深渊晕晕乎乎爬出来的我是一脸懵逼啊...啥是解除耦合...网上vuex的资料太少了,vuex手 ...

  7. 计算机体系结构的铁律(iron law)

    计算机体系结构的铁律可由下面公式来描写叙述: 从Programmer的角度来看,处理器的性能就是运行程序的耗费的时间.所以用Time/Program来刻画处理器性能.而这个简单的公式背后是有很丰富的内 ...

  8. 3 微信开发本地代理环境的搭建--实现将内网ip映射到外网

    微信公众号的开发,要搭建网站,并且随时都有可能修改网站内容进行调试,这就需要临时外网能返回本地开发环境搭建的项目进行测试,即内网映射到公网,但是好多开发者没有自己的域名和服务器,这里我们先来搭建一个本 ...

  9. 1.NetDh框架之数据库操作层--Dapper简单封装,可支持多库实例、多种数据库类型等(附源码和示例代码)

    1.NetDh框架开始的需求场景 需求场景: 1.之前公司有不同.net项目组,有的项目是用SqlServer做数据库,有的项目是用Oracle,后面也有可能会用到Mysql等,而且要考虑后续扩展成主 ...

  10. 嵌入式开发之davinci--- DVRRDK, EZSDK和DVSDK这三者有什么区别

    下载的时候选择信息要避免security类型的产品,这个是要审查的. DVRRDK是专门针对DVR的开发包是非公开的,针对安防的客户定制的,效率要高. EZSDK是开放的版本架构上使用openmax可 ...