Java
Java Java , Java “ ”。
Java , , ? , ? 。 Java (Reflection) 。
Java :
。
。
。
。
Reflection Java ( ) 。 Reflection APIs class , modifiers( public, static )、superclass( Object)、 interfaces( Serializable), fields methods , fields methods。
, , :“ , , ”。 ,Perl,Python,Ruby ,C++,Java,C# 。
Java , :Reflection。 “ 、 、 ”, Java 、 、 classes。 ,Java class, ( methods ), 、 fields 、 methods。 “ class” (the ability of the program to examine itself) introspection( 、 、 )。Reflection introspection 。
JDK , Java , java.lang.reflect :
Class : 。
Field : ( )。
Method : 。
Constructor : 。
Array : , 。
Reflection API :
、 Class 、 、 、 、
java.lang.Object getClass() , Java , 。Class Reflection API ,
getName(): 。
getFields(): public 。
getDeclaredFields(): 。
getMethods(): public 。
getDeclaredMethods(): 。
getMethod(String name, Class[] parameterTypes): ,name ,parameterTypes 。
getConstructors(): public 。
getConstructor(Class[] parameterTypes): ,parameterTypes 。
newInstance(): 。
:
public class RefConstructor {
public static void main(String args[]) throws Exception {
RefConstructor ref = new RefConstructor();
ref.getConstructor();
}
public void getConstructor() throws Exception {
Class c = null;
c = Class.forName("java.lang.Long");
Class cs[] = {java.lang.String.class};
System.out.println("
-------------------------------
");
Constructor cst1 = c.getConstructor(cs);
System.out.println("1、 Class :");
System.out.println(cst1.toString());
Constructor cst2 = c.getDeclaredConstructor(cs);
System.out.println("2、 Class :");
System.out.println(cst2.toString());
Constructor cst3 = c.getEnclosingConstructor();
System.out.println("3、 Constructor , 。");
if (cst3 != null) System.out.println(cst3.toString());
else System.out.println("-- !");
Constructor[] csts = c.getConstructors();
System.out.println("4、 Class :");
for (int i = 0; i < csts.length; i++) {
System.out.println(csts[i].toString());
}
System.out.println("
-------------------------------
");
Type types1[] = c.getGenericInterfaces();
System.out.println("1、 :");
for (int i = 0; i < types1.length; i++) {
System.out.println(types1[i].toString());
}
Type type1 = c.getGenericSuperclass();
System.out.println("2、 :");
System.out.println(type1.toString());
Class[] cis = c.getClasses();
System.out.println("3、 :");
for (int i = 0; i < cis.length; i++) {
System.out.println(cis[i].toString());
}
Class cs1[] = c.getInterfaces();
System.out.println("4、 ");
for (int i = 0; i < cs1.length; i++) {
System.out.println(cs1[i].toString());
}
System.out.println("
-------------------------------
");
Field fs1[] = c.getFields();
System.out.println("1、 :");
for (int i = 0; i < fs1.length; i++) {
System.out.println(fs1[i].toString());
}
Field f1 = c.getField("MIN_VALUE");
System.out.println("2、 :");
System.out.println(f1.toString());
Field fs2[] = c.getDeclaredFields();
System.out.println("3、 :");
for (int i = 0; i < fs2.length; i++) {
System.out.println(fs2[i].toString());
}
Field f2 = c.getDeclaredField("serialVersionUID");
System.out.println("4、 :");
System.out.println(f2.toString());
System.out.println("
-------------------------------
");
Method m1[] = c.getMethods();
System.out.println("1、 :");
for (int i = 0; i < m1.length; i++) {
System.out.println(m1[i].toString());
}
Method m2 = c.getMethod("longValue", new Class[]{});
System.out.println("2、 :");
System.out.println(m2.toString());
}
}
: , 。
、
ReflectTester Reflection API 。ReflectTester copy(Object object) , object , object ,
JavaBean, JavaBean public getXXX() setXXX() 。
public class ReflectTester {
public Object copy(Object object) throws Exception {
//
Class<?> classType = object.getClass();
System.out.println("Class:" + classType.getName());
//
Object objectCopy = classType.getConstructor(new Class[]{}).newInstance(new Object[]{});
//
Field fields[] = classType.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
String fieldName = field.getName();
String firstLetter = fieldName.substring(0, 1).toUpperCase();
// getXXX()
String getMethodName = "get" + firstLetter + fieldName.substring(1);
// setXXX()
String setMethodName = "set" + firstLetter + fieldName.substring(1);
// getXXX()
Method getMethod = classType.getMethod(getMethodName, new Class[]{});
// setXXX()
Method setMethod = classType.getMethod(setMethodName, new Class[]{field.getType()});
// getXXX()
Object value = getMethod.invoke(object, new Object[]{});
System.out.println(fieldName + ":" + value);
// setXXX()
setMethod.invoke(objectCopy, new Object[]{value});
}
return objectCopy;
}
public static void main(String[] args) throws Exception {
Customer customer = new Customer("Tom", 21);
customer.setId(new Long(1));
Customer customerCopy = (Customer) new ReflectTester().copy(customer);
System.out.println("Copy information:" + customerCopy.getId() + " " + customerCopy.getName() + " "
+ customerCopy.getAge());
}
}
class Customer {
private Long id;
private String name;
private int age;
public Customer() {
}
public Customer(String name, int age) {
this.name = name;
this.age = age;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
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;
}
}
:
Class:com.langsin.reflection.Customer
id:1
name:Tom
age:21
Copy information:1 Tom 21
Process finished with exit code 0
:
ReflectTester copy(Object object)
(1) :
Class classType=object.getClass();
System.out.println("Class:"+classType.getName());
(2) :
Object objectCopy=classType.getConstructor(new Class[]{}).newInstance(new Object[]{});
Class getConstructor() Constructor , , Constructor newInstance() 。
3) :
Field fields[]=classType.getDeclaredFields();
Class getDeclaredFields() , public、protected、 private
(4) getXXX() setXXX() , ,
、
public class InvokeTester {
public int add(int param1, int param2) {
return param1 + param2;
}
public String echo(String msg) {
return "echo: " + msg;
}
public static void main(String[] args) throws Exception {
Class<?> classType = InvokeTester.class;
Object invokeTester = classType.newInstance();
// Object invokeTester = classType.getConstructor(new
// Class[]{}).newInstance(new Object[]{});
// InvokeTester add()
Method addMethod = classType.getMethod("add", new Class[]{int.class, int.class});
// invokeTester add()
Object result = addMethod.invoke(invokeTester, new Object[]{new Integer(100), new Integer(200)});
System.out.println((Integer) result);
// InvokeTester echo()
Method echoMethod = classType.getMethod("echo", new Class[]{String.class});
// invokeTester echo()
result = echoMethod.invoke(invokeTester, new Object[]{"Hello"});
System.out.println((String) result);
}
}
InvokeTester main() , InvokeTester add() echo()
add() int , add() Method :
Method addMethod=classType.getMethod("add",new Class[]{int.class,int.class});
Method invoke(Object obj,Object args[]) , , 。invoke() , , invoke() , 。
, InvokeTester add() int , add Method invoke() , Integer , invoke() Integer ,Integer int :
Object result=addMethod.invoke(invokeTester,
new Object[]{new Integer(100),new Integer(200)});
System.out.println((Integer)result); //result Integer
、
java.lang.Array 。
ArrayTester1 main() 10 , 5 “hello”, 5
public class ArrayTester1 {
public static void main(String args[]) throws Exception {
Class<?> classType = Class.forName("java.lang.String");
// 10
Object array = Array.newInstance(classType, 10);
// 5 "hello"
Array.set(array, 5, "hello");
// 5
String s = (String) Array.get(array, 5);
System.out.println(s);
}
}
ArrayTester2 main() 5 x 10 x 15 , [3][5][10] 37。
public class ArrayTester2 {
public static void main(String args[]) {
int[] dims = new int[]{5, 10, 15};
// 。
Object array = Array.newInstance(Integer.TYPE, dims);
Object arrayObj = Array.get(array, 3);
Class<?> cls = arrayObj.getClass().getComponentType();
System.out.println(cls);
arrayObj = Array.get(arrayObj, 5);
Array.setInt(arrayObj, 10, 37);
int arrayCast[][][] = (int[][][]) array;
System.out.println(arrayCast[3][5][10]);
}
}
Class
Java Object , Java , Java :hashCode()、equals()、clone()、toString()、getClass() 。 getClass() Class 。
Class 。 classes Object, Java classes interfaces, enum、array、primitive Java types
(boolean, byte, char, short, int, long, float, double) void。 class , (class loader) defineClass() JVM ,JVM Class object。 “ Java ” Class object ( Class constructor println()), ! Class public constructor
Class Reflection 。 class, Class object, Reflection APIs
Java class Class 。 《 java.long.Class 》 。
, Reflection , “ ctor”, “ ctor”。 “ ctor“ , Class newInstance(), Constructor newInstance()。 Class[] ctor (
double int), getConstructor(), ctor。 Object[] ctor ( 3.14159 125), ctor newInstance()。
“Class object class” ; 。
“ ctor” 。 Class[] ( String, Hashtable), getMethod(), Method object。 Object[] , Method object invoke()。
Method object ?
method overloading signature , signature 。 , method , method。
、 field
,“ field ” , 。 Class getField() field 。 Field object Field get() set()。
public class RefFiled {
public double x;
public Double y;
public static void main(String args[]) throws NoSuchFieldException, IllegalAccessException {
Class c = RefFiled.class;
Field xf = c.getField("x");
Field yf = c.getField("y");
RefFiled obj = new RefFiled();
System.out.println(" x=" + xf.get(obj));
// x
xf.set(obj, 1.1);
System.out.println(" x=" + xf.get(obj));
System.out.println(" y=" + yf.get(obj));
// y
yf.set(obj, 2.1);
System.out.println(" y=" + yf.get(obj));
}
}
:
x=0.0
x=1.1
y=null
y=2.1
Process finished with exit code 0
:
http://bbs.langsin.com。
《 Java 》http://www.j2medev.com/Article/Class3/Class7/200604/1995.html
think in java
Java
: , , 。
, , , 。
-----------------
:
Java , , Java , 《Java Reflection in Action》 , 。