标签:
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中实现我们自定义的业务逻辑了。
在我们的配置文件当中与上面类似的配置节点还有很多,但它们的原理基本都是一致的,就是通过反射来动态创建对象,
实现框架组件的可插拔策略,从而使程序更灵活更具备扩展性。
注解?何为注解,注解的常用规范?
标签:
原文地址:http://www.cnblogs.com/wangzaiwei247482/p/5579530.html