您的位置:首页 > 编程语言 > Java开发

java 反射机制

2016-06-13 09:11 330 查看
一.什么是反射?

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, I
9f55
llegalArgumentException, 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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: