反射注解的程序举例

一要定义注解(第三方提供)

二要使用注解(我们就使用)

三要反射注解(框架读取它)

注意:

反射注解的要求是注解的保密策略必须是RUNTIME

反射注解需要从作用目标上返回

1、类上的注解需要使用Class来获取

2、方法上的注解需要使用Method来获取

3、构造器上的注解需要使用Construcator来获取

4、成员上的注解需要使用Field来获取

package 反射注解;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Test {
	// 获取类上的注解
	@org.junit.Test
	public void fun1() {
		/*
		 * 1.得到作用对象
		 */
		Class<A> class1 = A.class;
		/*
		 * 2.获取指定类型的注解
		 */
		MyAnnol myAnnol = class1.getAnnotation(MyAnnol.class);
		// 如果定义注解时不写// @Retention(RetentionPolicy.RUNTIME)就会null
		System.out.println("myAnnol是否为空呢?" + myAnnol);
		System.out.println(myAnnol.name() + "," + myAnnol.age() + ","
				+ myAnnol.sex());
	}

	// 获取方法上的注解
	@org.junit.Test
	public void fun2() throws NoSuchMethodException, SecurityException {
		// 1.得到作用目标
		Class<A> class1 = A.class;
		Method method = class1.getMethod("fun1");
		// 2.获取指定方法的注解
		MyAnnol myAnnol = method.getAnnotation(MyAnnol.class);
		System.out.println(myAnnol.name() + ", " + myAnnol.age() + ", "
				+ myAnnol.sex());

	}

	// 获取构造器上的注解
	@org.junit.Test
	public void fun3() throws NoSuchMethodException, SecurityException {
		// 1.得到作用目标
		Class<A> class1 = A.class;
		Constructor<A> constructor = class1.getConstructor(A.class);
		// 2.获取指定构造器的注解
		MyAnnol myAnnol = constructor.getAnnotation(MyAnnol.class);
		constructor.setAccessible(true);
		System.out.println(myAnnol.name() + ", " + myAnnol.age() + ", "
				+ myAnnol.sex());

	}

	// 获取成员变量上的注解
	@org.junit.Test
	public void fun4() throws NoSuchFieldException, SecurityException {
		// 1.得到作用目标
		Class<A> class1 = A.class;
		Field field = class1.getField("string");
		// 2.获取指定成员变量上的注解
		MyAnnol myAnnol = field.getAnnotation(MyAnnol.class);
		// field.setAccessible(true);//可以访问私有变量
		System.out.println(myAnnol.name() + ", " + myAnnol.age() + ", "
				+ myAnnol.sex());

	}
}

// 注解使用在类上
@MyAnnol(name = "A类", age = 1, sex = "男")
class A {
	// 注解使用在成员变量上
	@MyAnnol(name = "成员变量", age = 0, sex = "女")
	public String string;// 定义为public就可以使用,定义为priavate的话要field.setAccessible(true);

	// 注解使用在成员方法上
	@MyAnnol(name = "fun1方法", age = 2, sex = "女")
	public void fun1() {

	}

	// 注解使用在构造器上
	@MyAnnol(name = "无参构造器", age = 3, sex = "男")
	public A() {
	}

}

// 定义注解(要使用一个枚举元注解)
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnol {
	String name();

	int age();

	String sex();
}

Java注解示图

时间: 2024-10-06 08:32:21

反射注解的程序举例的相关文章

java反射注解的用途

很多人都知道java的反射机制和注解技术.反射(Reflection)就是加载类,并解剖出类的各个组成部分:而Annotation 其实就是代码里的特殊标记, 它用于替代配置文件,也就是说,传统方式通过配置文件告诉类如何运行,有了注解技术后,开发人员可以通过注解告诉类如何运行.那么两者结合能够产生出什么? 首先来看下面一个程序 回想我们以前产生Connection的方法,我是都是在配置文件中配置好driver,url,username,password,而现在我们利用反射加注解可以利用方法上注解

C#运用反射调用其他程序集中的代码

加载程序集 AssMedicalAdvice = Assembly.LoadFrom(Path.Combine(Environment.CurrentDirectory, "Inscription.MedicalAdvice.Client.dll")); 1.调用静态函数,静态函数不需要实例化类,所以methodInfo.Invoke第一个参数为null type = AssClinicalPaths.GetType("Inscription.ClinicalPaths.Cl

oracle的引用型变量和记录型变量程序举例

--引用型变量 --打开oracle的输出口 --set serveroutput on declare --定义引用型变量,查询并打印1232的姓名和薪水 --pename varchar2(20);--这2句和下面的2句效果一致 --psal number; pename emp.ename%type; psal emp.sal%type; begin --得到1232的姓名和薪水 --赋值的方式有:=和into select ename,sal into pename,psal from

Java 为什么要使用反射(通俗易懂的举例)

Java反射最大的好处就是能在运行期间,获得某个类的结构.成员变量,用来实例化. 下列是具体使用场景:假如我们有两个程序员,一个程序员在写程序的时候,需要使用第二个程序员所写的类,但第二个程序员并没完成他所写的类.那么第一个程序员的代码能否通过编译呢?这是不能通过编译的.利用Java反射的机制,就可以让第一个程序员在没有得到第二个程序员所写的类的时候,来完成自身代码的编译.Java的反射机制它知道类的基本结构,这种对Java类结构探知的能力,我们称为Java类的"自审".大家都用过Jc

[记录] java反射+注解

框架开发之Java注解的妙用 JAVA反射与注解 Java基础 :反射.注解.代理.线程池.依赖的学习和理解 Java反射与注解 原文地址:https://www.cnblogs.com/zad27/p/12121589.html

java 反射注解信息

Table,用类表示数据库的表 @Target(value= {ElementType.METHOD,ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface Table{ String value(); } 类中的属性,每个属性表示一个字段 @Target(value= ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interf

有一个反射的小程序引出的问题

public class second{ public static void main(String[]args){ try{ Method sqrt=Math.class.getMethod("sqrt",double.class); rr(3,sqrt); }catch(Exception e){}; } private static void rr(double c,Method f){ try{ double x=(double)f.invoke(null, c); Syst

c#编程:委托程序举例

委托不是方法,它是一种特殊的类型,用于对与该委托有相同签名(签名这里指方法的参数列表)的方法的调用. 委托的一个重要特点是:委托在调用方法时,不必关心方法所属的对象的类型,它只要求所提供的方法的签名和委托的签名相匹配. 委托声明格式:修饰符 delegate 返回类型 委托名(参数列表) public  delegate  void       BTEvent(); 附一个例子: using System; using System.Collections.Generic; using Syst

IO流中文件和目录的删除程序举例

/* * 删除功能(不管是目录还是文件都是用delete方法,只能一级一级的删除,):public boolean delete() * * 注意: * A:如果你创建文件或者文件夹忘了写盘符路径,那么,默认在项目路径下. * B:Java中的删除不走回收站. * C:要删除一个文件夹,请注意该文件夹内不能包含文件或者文件夹 */ package cn.itcast_03; import java.io.File; import java.io.IOException; public class