java反射注解的用途

很多人都知道java的反射机制和注解技术。反射(Reflection)就是加载类,并解剖出类的各个组成部分;而Annotation 其实就是代码里的特殊标记, 它用于替代配置文件,也就是说,传统方式通过配置文件告诉类如何运行,有了注解技术后,开发人员可以通过注解告诉类如何运行。那么两者结合能够产生出什么?

首先来看下面一个程序

package cn.lmj.annotation;

import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;

public class Demo01
{
    //利用注解的信息生成Connection
	@DbInfo(driver="com.mysql.jdbc.Driver",url="jdbc:mysql:///test",username="root",password="root")
	public static Connection getConnection()
	{
		try
		{
		    //反射获得这个方法
			Method method = JdbcUtils.class.getMethod("getConnection", new Class[]{});
			//反射方法是是否有这个注解
			DbInfo info = method.getAnnotation(DbInfo.class);
			if(info != null)
			{
				String driver = info.driver();
				String url = info.url();
				String username = info.username();
				String password = info.password();
				Class.forName(driver);
				Connection conn = DriverManager.getConnection(url, username, password);
				return conn;
			}
			return null;
		}
		catch (Exception e)
		{
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}
	
	public static void main(String[] args)
	{
		System.out.println(getConnection());
	}
}
回想我们以前产生Connection的方法,我是都是在配置文件中配置好driver,url,username,password,而现在我们利用反射加注解可以利用方法上注解上的元信息产生Connection,这个方式代替了以前传统通过配置文件的方式,这个程序只是演示反射注解上的信息生成对象,下面我们利用反射注解为程序注入对象

package cn.lmj.annotation;

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

public class Person
{
    //通过注解注入对象
	@Inject(name="cn.lmj.annotation.Book")
	private Book book;
	
	public Book getBook()
	{
		return this.book;
	}
	
	public static void main(String[] args)
	{
	    //对象由工厂产生
		Person p = Factory.getBean(Person.class);
		System.out.println(p.getBook());
	}
}

class Book
{
	
}

@Retention(RetentionPolicy.RUNTIME)
@interface Inject
{
	String name();
}

//工厂对象
class Factory
{
    //产生对象
	public static 
   
   
    
     T getBean(Class
    
     clazz)
	{
		try
		{
			Object obj = clazz.newInstance();
			Field[] fields = obj.getClass().getDeclaredFields();
			for(int i = 0;fields!=null && i
    
    
   
   
在这个代码中,Person类的Book对象由方法注解上的信息产生实例对象,从而利用反射注进去,这个例子充分体现了软件开发的解耦思想,Person类的Book对象由工厂产生和维护,并且必要时可以切换Book类的实例(在实际开发我们是面向接口编程,可以随意切换子类)。在spring中的注解bean中大量用到了这个技术,我们的应用集成了spring的开发环境,我们发现程序中需要其他的对象时候,不需要new,而是轻轻的写个注解,对象就注进去了,通过这个例子,我们对spring的注解bean有进一步的认识,并且自己能够实现这样的功能,让我们以后在开发的过程中能够很自信的利用spring的注解bean,下次将给大家讲解spring的aop原理和开发中应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值