`
he_wen
  • 浏览: 238606 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

注解与反射

    博客分类:
  • Java
阅读更多

一、java 1.5的新特新注解和枚举

二、本文主要讲解注解和反射的主题应用?

1、Java.lang包下游三个基本的注解分别是:Deprecated用 @Deprecated 注释的程序元素,不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择。在使用不被赞成的程序元素或在不被赞成的代码中执行重写时,编译器会发出警告。

2、注释类型 OverrideOverride

表示一个方法声明打算重写超类中的另一个方法声明。如果方法利用此注释类型进行注解但没有重写超类方法,则编译器会生成一条错误消息。

3、注释类型 SuppressWarningsSuppressWarnings

指示应该在注释元素(以及包含在该注释元素中的所有程序元素)中取消显示指定的编译器警告。注意,在给定元素中取消显示的警告集是所有包含元素中取消显示的警告的超集。例如,如果注释一个类来取消显示某个警告,同时注释一个方法来取消显示另一个警告,那么将在此方法中同时取消显示这两个警告。如:

@SuppressWarnings("deprecation")
    public static void main(String[] args) throws Exception{
            System.runFinalizersOnExit(true);

 

}

三、定义自己的注解

下面是说明定义注解的方法,以及怎样查看API


 
 


  下面是编写自己的注解的实例,此源代码有详细的解说,下面就只需大家运行一下代码即可:

这个是自己定义的注解类

package cn.itcast.day2;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import cn.itcast.day1.EnumTest;
/***
 * 注解可以注入哪些属性呢?
 * 可以注入注解的注解,数组,基本类型,String,枚举还以上类型的数组,还有Class
 * 当注入数组只有一个值的时候可以写成如:
 * @Target(ElementType.METHOD)
 * @author Administrator
 *@Retention注解的生命周期,注解类要经过三个生命周期,
 * 
    SOURCE,注解就会在编译的时候注解类会抛弃
    CLASS,注解类编译成class文件后不想保留在虚拟机里,则抛弃,这个是默认值
     * Annotations are to be recorded in the class file by the compiler and
     * retained by the VM at run time, so they may be read reflectively.
     * 
    RUNTIME
 */
@Retention(RetentionPolicy.RUNTIME)//元注解,信息的信息就叫元信息
/**
 * 这个注解的意思就是自定义的注解用户可以放在哪里进行注解
 * 如:可以在属性、构造方法、方法、参数声明、类接口等
 * 详细请查看文档ElementType枚举的类型
 */
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface ItcastAnnotation {
	String color() default "blue";//default想让注解射入属性一个值
	String value();
	int[] arrayAttr() default {3,4,4};
	EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED;
	MetaAnnotation annotationAttr() default @MetaAnnotation("lhm");
	Class getType();
}
 


  这个是测试的代码

package cn.itcast.day2;

import java.lang.reflect.Method;
import java.lang.reflect.Type;

import cn.itcast.day1.ReflectPoint;

/***
 * 如果@ItcastAnnotation注解类的属性有默认的值可以不注入值
 * @author Administrator
 *
 */

@ItcastAnnotation(annotationAttr=@MetaAnnotation("flx"),color="red",value="abc",arrayAttr=1,getType=ReflectPoint.class)
public class AnnotationTest {
	@SuppressWarnings("deprecation")
	//@ItcastAnnotation("xyz")
	public static void main(String[] args) throws Exception{
		System.runFinalizersOnExit(true);
		if(AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class)){
			ItcastAnnotation annotation = (ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class);
			System.out.println(annotation.color());
			System.out.println(annotation.value());
			System.out.println(annotation.arrayAttr().length);
			System.out.println(annotation.lamp().nextLamp().name());
			System.out.println(annotation.annotationAttr().value());
			//利用反射机制获取ReflectPoint类的实例
			System.out.println(annotation.getType().getConstructor(new Class[]{int.class,int.class}).newInstance(2,3));
			Method[] methods=annotation.getType().getMethods();
			String methodName;
			String fieldName;
			Type type;
			for(Method method:methods){
				methodName=method.getName();
				fieldName=methodName.substring(3).toLowerCase();
				
				if(methodName.startsWith("set")){
					System.out.println(methodName);
				   // type=method.getGenericParameterTypes()[0];//可以得到方法的参数类型
				   //System.out.println(type);
				}
			}
		}
	}

	@Deprecated
	public static void sayHello(){
		System.out.println("hi,"得到");
	}

 这个是枚举类

package cn.itcast.day1;

import java.util.Date;

public class EnumTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		WeekDay1 weekDay = WeekDay1.MON;
		System.out.println(weekDay.nextDay());
		
		WeekDay weekDay2 = WeekDay.FRI;
		System.out.println(weekDay2);
		System.out.println(weekDay2.name());
		System.out.println(weekDay2.ordinal());	
		System.out.println(WeekDay.valueOf("SUN").toString());
		System.out.println(WeekDay.values().length);
		
		new Date(300){};
	}

	public enum WeekDay{

		SUN(1),MON(),TUE,WED,THI,FRI,SAT;
		private WeekDay(){System.out.println("first");}
		private WeekDay(int day){System.out.println("second");}
	}
	
	public enum TrafficLamp{
		RED(30){
			public  TrafficLamp nextLamp(){
				return GREEN;
			}
		},
		GREEN(45){
			public  TrafficLamp nextLamp(){
				return YELLOW;
			}			
		},
		YELLOW(5){
			public  TrafficLamp nextLamp(){
				return RED;
			}			
		};
		public abstract TrafficLamp nextLamp();
		private int time;
		private TrafficLamp(int time){this.time = time;}
	}
}

 这个是要注入的class类:ReflectPoint

package cn.itcast.day1;

import java.util.Date;

public class ReflectPoint {
	private Date birthday = new Date();
	
	private int x;
	public int y;
	public String str1 = "ball";
	public String str2 = "basketball";
	public String str3 = "itcast";
	
	public ReflectPoint(int x, int y) {
		super();
		this.x = x;
		this.y = y;
	}
	
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + x;
		result = prime * result + y;
		return result;
	}


	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		final ReflectPoint other = (ReflectPoint) obj;
		if (x != other.x)
			return false;
		if (y != other.y)
			return false;
		return true;
	}


	@Override
	public String toString(){
		return str1 + ":" + str2 + ":" + str3;
	}


	public int getX() {
		return x;
	}


	public void setX(int x) {
		this.x = x;
	}


	public int getY() {
		return y;
	}


	public void setY(int y) {
		this.y = y;
	}


	public Date getBirthday() {
		return birthday;
	}


	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	
}
 

 

 

  • 大小: 58.9 KB
0
0
分享到:
评论

相关推荐

    Android-注解与反射注解知识点反射知识点注解java反射

    6. **注解与反射**:反射可以读取类、方法、字段上的注解信息,这在运行时动态处理逻辑、实现插件化等方面非常有用。 在`AnnotationDemo-master`这个项目中,可能包含了注解和反射的实践案例,例如通过注解定义接口...

    java注解和反射的个人学习笔记

    java注解和反射的个人学习笔记

    反射操作注解与反射操作泛型.docx

    反射操作注解与反射操作泛型 在 Java 编程中,反射操作和泛型是两个重要的概念。反射操作是指在运行时检查和修改类、对象、方法、字段等信息的能力,而泛型是指在编译时检查和限制类型的能力。本文将详细介绍反射...

    注解与反射高效开发法.pdf

    总之,注解与反射是Java语言的核心高级特性之一,它们能够提供强大的代码动态性,对于实现框架设计、简化代码编写等都有极大的帮助。Java开发者应当充分理解和掌握这些高级特性,以便在实际开发中运用自如。

    (02)2020.4.26 Java高级语言特性,注解与反射---lance老师.rar

    在这个压缩包文件"(02)2020.4.26 Java高级语言特性,注解与反射---lance老师.rar"中,我们主要探讨的是Java的两个高级特性:注解(Annotation)和反射(Reflection)。这两个特性是Java编程中的重要工具,极大地...

    注解与反射-狂神说Java学习笔记

    在Java编程语言中,注解(Annotation)和反射(Reflection)是两个非常重要的高级特性,它们为程序提供了元数据信息和运行时动态操作类的能力。本文将深入探讨这两个概念及其在实际开发中的应用。 首先,让我们了解...

    利用JAVA注解与反射 - 实现SQL语句自动生成

    利用JAVA注解实现SQL语句自动生成 编写对应Entity添加相关注解,并通过SqlUtil工具,传入相关参数生成SQL语句 例如:要生成对应数据库Person的SQL增删改查 SqlUtil.create(Person.class) SqlUtil.insert(Person....

    Java注解与反射原理说明

    当注解与反射结合时,我们可以利用反射机制来读取和处理注解中的信息。在Java中,`AnnotatedElement`接口提供了获取注解的方法,包括`getAnnotations()`和`getAnnotation(Class<T> annotationClass)`。 1. `...

    Java自定义注解使用反射获取字段注解

    本文将深入探讨如何通过反射机制来获取自定义注解以及其在字段上的应用。 首先,我们需要了解什么是自定义注解。自定义注解是以`@`开头,后跟自定义的名称。定义一个注解的基本结构如下: ```java import java....

    android 反射注解框架

    在Android开发中,注解(Annotation)和...通过深入理解和运用注解与反射,开发者可以进一步优化代码结构,提高应用程序的质量。在实际项目中,类似的框架可以作为一个基础工具库,方便快速开发新功能,降低维护成本。

    注解+ 反射实例demo

    ### 结合注解与反射的实例 在`ReflectDemo`中,可能会包含一个使用自定义注解`@Loggable`的方法,通过反射来检测这个注解并在运行时执行相应的日志记录。例如: ```java public class ReflectDemo { @Loggable(...

    java 反射实例,大量注释,简单易懂

    6. **注释与反射**: - Java反射还可以用于读取类、方法、字段上的注释,这对于元数据驱动的设计尤其有用。 7. **反射的使用场景**: - 动态加载类:在运行时根据用户输入或配置文件加载相应的类。 - 框架开发:...

    java注解和反射的12个demo.zip

    这些Demo旨在帮助学习者深入理解Java注解和反射的原理与应用,通过实际操作加深对这两个概念的认识,提高开发能力。在学习过程中,结合B站狂神的讲解,能够更有效地掌握这些高级特性,为日后的项目开发打下坚实的...

    java 通过反射获取类上注解,方法上注解,注解里的值及方法参数

    1. **注解的定义与使用** 注解以`@`符号开头,后面跟着注解的类型。例如,`@Override`表示方法重写,`@Deprecated`表示某个功能已过时。注解可以应用于类、接口、字段、方法等。注解本身不直接影响程序的执行,但...

    反射注解暴力反射详细思维导图.xmind

    反射注解暴力反射详细思维导图.xmind

    java注解、java反射机制 jdbc 封装

    Java注解和反射机制是Java开发中的重要工具,它们极大地增强了代码的可读性和灵活性。在结合JDBC(Java Database Connectivity)API时,可以构建出更高效、更易维护的数据访问层。本案例通过注解的方式,简化了JDBC...

    servlet反射注解例子

    本示例“servlet反射注解例子”旨在帮助我们深入理解如何将这两种技术结合使用,以实现更加灵活和可维护的服务器端应用程序。本文将详细探讨反射和注解在Servlet中的应用。 首先,让我们来了解一下什么是反射。反射...

    Java-JDBC【源码】实现ORM,结果集映射实体类(ResultSet、注解、反射)

    Java-JDBC【之】实现ORM,结果集映射实体类(ResultSet、注解、反射) 1.ORM实现思路 2.@Table、@Column、标识实体类 2.1.创建注解 @Table、@Column 2.2.标识实体类 2.3.数据库表 3.结果集解析,注解加反射填充实体...

    运用注解改变反射之后类属性的顺序

    默认情况下,Java反射API(如`Field[] getDeclaredFields()`方法)返回的字段数组顺序与它们在源代码中的声明顺序一致。在某些场景下,如序列化或JSON转换,我们可能需要控制这些属性的顺序。 为了解决这个问题,...

    Java反射实例源码

    8. **注解与反射**:可以使用`getAnnotations()`和`isAnnotationPresent()`等方法检查类、方法、字段上的注解,从而实现基于注解的编程。 9. **动态代理**:`java.lang.reflect.Proxy`类允许创建动态代理,用于在...

Global site tag (gtag.js) - Google Analytics