一.什么是反射?
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
二.反射常用的方法?
(1) package
(2) import
(3) modifier
class(或methods, fields)的属性
int getModifiers()
Modifier.toString(int)
Modifier.isInterface(int)
int
String
bool
(4) class name or interface name
class/interface
名称getName()
String
(5) type parameters
参数化类型的名称
getTypeParameters()
TypeVariable <Class>[]
(6) base class
base class(只可能一个)
getSuperClass()
Class
(7) implemented interfaces
实现有哪些interfaces
getInterfaces()
Class[]
(8) inner classes
内部classes
getDeclaredClasses()
Class[]
(8') outer class
如果我们观察的class 本身是inner classes,那么相对它就会有个outer class。
getDeclaringClass()
Class
(9) constructors
构造函数getDeclaredConstructors()
不论 public 或private 或其它access level,皆可获得。另有功能近似之取得函数。
Constructor[]
(10) methods
操作函数getDeclaredMethods()
不论 public 或private 或其它access level,皆可获得。另有功能近似之取得函数。
Method[]
(11) fields
字段(成员变量)
getDeclaredFields()不论 public 或private 或其它access level,皆可获得。另有功能近似之取得函数。
三.反射应用场景
反射用于实现增加,删除,修改,查找操作
四,例子
测试反射代码:
package com.gxa.bj.test;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import com.gxa.bj.model.UserInfo;
import com.gxa.bj.util.BeanUtil;
public class TestUI {
public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
// TODO Auto-generated method stub
//第一种方法
Class classzz = Person.class;
//第二种方法
//Person p = new Person();
//Class classz2 = p.getClass();
//第三种方法
// try {
// Class classz3=Class.forName("com.gxa.bj.test.Person");
// } catch (ClassNotFoundException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
System.out.println("类的名字:"+classzz.getSimpleName());
Field[] fields = classzz.getDeclaredFields();
for(Field f:fields){
Class c= f.getType();
if(c.getPackage()!=null){
if(c.getPackage().getName()!=null){
System.out.println("哈哈");
System.out.println(c.getPackage().getName());
System.out.println("字段的类型:"+c.getName());
System.out.println("字段的名字:"+f.getName());
}
}
}
String userInfoSQL = BeanUtil.getSelectSQL(new UserInfo());
System.out.println(userInfoSQL);
}
}
实现增删改查的代码:
package com.gxa.bj.util;
import java.lang.reflect.Field;
mport java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class BeanUtil {
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);
Object value = f.get(obj);
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;
}
}