1、JAVA反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性;這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為java語言的反射機制。(見百度百科)
2、主要功能:Java反射機制主要提供了以下功能: 在運行時判斷任意一個對象所屬的類;在運行時構(gòu)造任意一個類的對象;在運行時判斷任意一個類所具有的成員變量和方法;在運行時調(diào)用任意一個對象的方法;生成動態(tài)代理。
1、通過類名,獲取類具有的方法和屬性
首先,定義一個類用于后面的操作
package ObjectDemo;
public class Coordinate {
private float x;
private float y;
private float z;
public float threshold=0.001f; //闕值
public float getX() {
return x;
}
public void setX(float x) {
this.x = x;
}
public float getZ() {
return z;
}
public void setZ(float z) {
this.z = z;
}
public float getY() {
return y;
}
public void setY(float y) {
this.y = y;
}
//無參構(gòu)造函數(shù)
public Coordinate()
{
this.x = 0;
this.y = 0;
this.z = 0;
}
public Coordinate(float x,float y,float z)
{
this.x = x;
this.y = y;
this.z = z;
}
//判斷兩個坐標是否相等
private boolean isEqual(Coordinate other)
{
if(Math.abs(other.getX()-this.getX())>threshold)return false;
if(Math.abs(other.getY()-this.getY())>threshold)return false;
if(Math.abs(other.getZ()-this.getZ())>threshold)return false;
return true;
}
//輸出屬性
public void showThings()
{
System.out.println("X:"+x+" Y:"+y+" Z:"+z);
}
public void showThings(String name)
{
System.out.println(name+" X:"+x+" Y:"+y+" Z:"+z);
}
}
獲取類的信息
package ReflectDemo2;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Parameter;
public class ClassDetail {
private Class aClass;
public ClassDetail(String className)
{
try {
aClass = Class.forName(className);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//獲得方法的詳細信息
public void getMethodsDetail()
{
Method methods[]=aClass.getDeclaredMethods();
for(Method method:methods)
{
//這里就可以利用Method類里的眾多的get方法獲得它的信息了
System.out.print(Modifier.toString(method.getModifiers()));
System.out.print(" " + method.getReturnType());
System.out.print(" " + method.getName()+'(');
Parameter parameters[] = method.getParameters();
int length = parameters.length;
if(length>0)
{
for (int i = 0; i < length - 1; ++i) {
System.out.print(parameters[i].getType() + " " + parameters[i].getName() + ",");
}
System.out.print(parameters[length - 1].getType() + " " + parameters[length - 1].getName());
}
System.out.print(")" + '\n');
}
}
//獲得屬性的詳細方法
public void getFieldDetail()
{
//getDeclaredFields獲得所有的屬性,getFields獲得非私有的
Field fields[] = aClass.getDeclaredFields();
for(Field field:fields)
{
System.out.println(Modifier.toString(field.getModifiers())+" "+field.getType()+" "+field.getName());
}
}
}
調(diào)用
public class RfMain {
public static void main(String[] args) {
ClassDetail detail = new ClassDetail("ObjectDemo.Coordinate");
detail.getMethodsDetail();
detail.getFieldDetail();
}
}
輸出結(jié)果
private boolean isEqual(class ObjectDemo.Coordinate arg0)
public float getX()
public void setX(float arg0)
public float getY()
public void setY(float arg0)
public float getZ()
public void setZ(float arg0)
private float x
private float y
private float z
public float threshold
2、利用反射機制構(gòu)造類對象,調(diào)用類的方法
無參數(shù)構(gòu)造,無參數(shù)方法的調(diào)用
public static void main(String[] args) {
try {
Class cls = Class.forName("ObjectDemo.Coordinate");
Object object = cls.newInstance();
Method method = cls.getMethod("showThings");
method.invoke(object);
} catch (Exception e) {
e.printStackTrace();
}
}
結(jié)果:
X:0.0 Y:0.0 Z:0.0
有參數(shù)構(gòu)造,無參數(shù)方法的調(diào)用
public static void main(String[] args) {
try {
Class cls = Class.forName("ObjectDemo.Coordinate");
Constructor cons = cls.getConstructor(float.class,float.class,float.class);
Object object = cons.newInstance(2,3,4);
Method method = cls.getMethod("showThings");
method.invoke(object);
} catch (Exception e) {
e.printStackTrace();
}
}
結(jié)果:
X:2.0 Y:3.0 Z:4.0
無參數(shù)構(gòu)造,有參數(shù)方法的調(diào)用
public static void main(String[] args) {
try {
Class cls = Class.forName("ObjectDemo.Coordinate");
Object object = cls.newInstance();
Method method = cls.getMethod("showThings",String.class);
method.invoke(object, "Quincy say:");
} catch (Exception e) {
e.printStackTrace();
}
}
結(jié)果:
Quincy say: X:0.0 Y:0.0 Z:0.0
反射就學習到這里了,那它到底有什么用呢?呵呵?。。‖F(xiàn)在我們就來說一個它的應(yīng)用吧,例如數(shù)據(jù)庫操作,我們定義了一些和數(shù)據(jù)庫的表結(jié)構(gòu)相同的類,我們就可以利用反射機制生成sql語句,而且只要寫一次,是不是很方便?