码迷,mamicode.com
首页 > 编程语言 > 详细

java反射知识

时间:2016-06-14 17:38:10      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:

  1.什么是反射?

    反射,Reflection,通过它我们可以在运行时获得各种信息,如程序集、模块、类型、字段、属性、方法和事件。

   架构图:

技术分享

2.反射的常用方法?

 技术分享

package com.wzw.text;

public class Person {
private String name;
private int age;
private job job;

public job getJob() {
return job;
}

public void setJob(job job) {
this.job = job;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

 

public Person() {

}
}

简单的UI测试:

package com.wzw.text;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;

import com.wzw.modal.TitleInfo;
import com.wzw.modal.UserInfo;
import com.wzw.util.Reflect;

public class TextUI {

    public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        // TODO Auto-generated method stub
     Class classzz = Person.class;
     Field[] fields = classzz.getDeclaredFields();
     for(Field f: fields){
         Class c = f.getType();
         if(c.getPackage()!=null){
             if(c.getPackage().getName().equals("com.wzw.text")){
              System.out.println(c.getPackage().getName());
              System.out.println("类型:"+c.getName());
              System.out.println("名字:"+f.getName());
             }
         }
     }
     String userInfoSQL = Reflect.getSelectSQL(new UserInfo());
     System.out.println(userInfoSQL);
    }

}

反射的查找相关代码:

package com.wzw.util;

import java.lang.reflect.*;

public class Reflect {
   public static String getSelectSQL(Object obj) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
	   Class<? extends Object> classzz = obj.getClass();
	   String tableName = classzz.getSimpleName();
	   StringBuffer sbsql = new StringBuffer();
	   sbsql.append("Select * From "+tableName+" ");
	   sbsql.append(" Where 1=1 ");
	   Field[] fields = classzz.getDeclaredFields();//获取所定义的字段
	   for(Field f:fields){
		   String methodName ="get"+ f.getName().substring(0,1).toUpperCase()+f.getName().substring(1);
		   Method m = classzz.getDeclaredMethod(methodName);//获取某个方法
		   Object o = m.invoke(obj);
		   if(o!=null){
			   if(o instanceof String){
			      sbsql.append(" And "+f.getName() +"=‘"+o+"‘ ");
			   }else{
				  sbsql.append(" And "+f.getName()+"="+o);
			   }
		   }
	   }
	   return sbsql.toString();
   }
   /*public static String getUpdate(Object obj) throws IllegalArgumentException, IllegalAccessException{
	   Class<? extends Object> classzz = obj.getClass();
	   String sql="Update "+ classzz.getSimpleName() + " Set ";
	   String sql2=" ";
	   String sql3=" Where ";
	   Field[] fields = classzz.getDeclaredFields();
	   for(Field f:fields){
		   f.setAccessible(true);//可以访问private值
		   Object value = f.get(obj);
		   //如果该字段具备PrimaryKey的注解
		   if(f.isAnnotationPresent(PrimaryKey.class)){

			   if(value instanceof String){
				   sql3 += f.getName() +"=‘"+value+"‘";
			   }else{
				   sql3 += f.getName()+"="+value+"";
			   }
		   }else if(!f.isAnnotationPresent(NonField.class)){
			   if(value instanceof String){
				   sql2 += f.getName() +"=‘"+value+"‘,";
			   }else{
				   sql2+=f.getName()+"="+value+", ";
			   }
		   }
	   }
	   sql2 = sql2.substring(0,sql2.length()-1);
	   sql = sql + sql2 +sql3;
	   return sql;
	   
   }*/
}
反射的应用场景:
反射在应用中大多会与配置文件、特性等元素联系起来,接下来我们来看一些配置节点片段代码。 配置节点一
<httpModules> <add name="test" type="MyModule.MyHttpModule,MyHttpModule"/> </httpModules> 配置节点二 <handlers> <add name="AjaxPro" verb="POST,GET" path="ajaxpro/*.ashx" type="AjaxPro.AjaxHandlerFactory,AjaxPro"/> </handlers> 这两个配置节点相信大家都不陌生,节点一是为asp.net处理管道流程注册一个自定义处理模块,
第二个配置节点是为asp.net特定目录下的某种特定文件注册一种自定义的处理程序,
这里的例子是AjaxPro的配置节。对于httpModules和httpHandler理解有偏差的地方欢迎大家指正,我们接着往下。
很多时候对于这样的配置文件我们只知道要这配置,程序运行起来之后也不会去思考一个为什么。
这两个add配置节点里面都有一个type
= "XXX.XXX,XXXX"的属性,属性值配置的是 "命名空间.类名,程序集名称"
这正好符合我们反射创建一个对象的必要条件,配置节点的值告诉了我们程序集的名称还有类的信息。
通常的情况下反射还会和工厂模式结合起来形成反射工厂,asp.net会在应用程序启动时去读取web.config配置文件的信息,
并去加载需要的程序集,然后通过反射的方式来创建我们注册的httpModules和httpHandler类型的对象。
这样就可以很轻松的在httpModules和httpHandler中实现我们自定义的业务逻辑了。 在我们的配置文件当中与上面类似的配置节点还有很多,但它们的原理基本都是一致的,就是通过反射来动态创建对象,
实现框架组件的可插拔策略,从而使程序更灵活更具备扩展性。

注解?何为注解,注解的常用规范?
        

java反射知识

标签:

原文地址:http://www.cnblogs.com/wangzaiwei247482/p/5579530.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!