-------android培训、java培训、期待与您交流! ----------
package cn.itcast.day1;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
public class ReflectTest
{
/**
* @param args
* @throws ClassNotFoundException
* @throws NoSuchMethodException
* @throws SecurityException
* @throws InvocationTargetException
* @throws IllegalAccessException
* @throws InstantiationException
* @throws IllegalArgumentException
* @throws NoSuchFieldException
*/
public static void main(String[] args) throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchFieldException
{
String str1 = "abc";
Class clazz1 = str1.getClass();
Class clazz2 = String.class;
Class clazz3 = Class.forName("java.lang.String");
System.out.println(clazz1 == clazz2); //true
System.out.println(clazz1 == clazz3); //true : only one class byte file exsists in the memory!
//类型
System.out.println(clazz1.isPrimitive()); // String'object is not primitive type
System.out.println(int.class.isPrimitive());//true
System.out.println(int.class == Integer.class);//false
System.out.println(int[].class.isPrimitive());//数组也不是原生类型
System.out.println(int[].class.isArray());// 数组类型与原生类型并列
//构造函数
Constructor constructor1 = String.class.getConstructor(StringBuffer.class);//得到Constructor的实例
String str2 = (String)constructor1.newInstance(new StringBuffer("abc"));//调用其方法去获得实例
System.out.println(str2.charAt(2));
//自定义类的反射
ReflectPoint pt1 = new ReflectPoint(3,5), pt2 = new ReflectPoint(4, 6);
Field fieldY = pt1.getClass().getField("y");// 获取的是类的字段信息
System.out.println(fieldY.get(pt1)); //public field can be getted! 3
System.out.println(fieldY.get(pt2)); //public field can be getted! 5
Field fieldX = pt1.getClass().getDeclaredField("x");// not the same with the public fields
fieldX.setAccessible(true);// access private field.
System.out.println(fieldX.get(pt1));
//用反射改变对象的值
changeStringValue(pt1);
System.out.println(pt1);
// 方法
Method methodCharAt = String.class.getMethod("charAt", int.class);
System.out.println(methodCharAt.invoke(str1, 1));
System.out.println(methodCharAt.invoke(str1, new Object[]{1}));//variable parameter
//反射调用 TestArguments .main方法
String startingClassName = args[0];
System.out.println(startingClassName);
Method methodMain = Class.forName("cn.itcast.day1."+startingClassName).getMethod("main", String[].class);
//methodMain.invoke(null, (Object)new String[]{"11", "22", "33"});//静态方法无需传入调用者对象
methodMain.invoke(null, (Object)new String[]{"11", "22"});//静态方法无需传入调用者对象,防止拆分吧
int [] a1 = new int[]{1,2,3};
Integer [] a11 = new Integer[]{1,2,3};
int [] a2 = new int[4];
int[][] a3 = new int[2][3];
String [] a4 = new String[]{"a","b","c"};
System.out.println(a1.getClass() == a2.getClass()); //true
//System.out.println(a1.getClass() == a4.getClass());
//System.out.println(a1.getClass() + a3.getClass());
System.out.println(a1.getClass().getName()); //[I
System.out.println(a11.getClass().getName()); //[Ljava.lang.Integer;
System.out.println(a4.getClass().getName()); //[Ljava.lang.String;
System.out.println(a3.getClass().getName()); //[[I
System.out.println(a1.getClass().getSuperclass().getName());//java.lang.Object
System.out.println(a4.getClass().getSuperclass().getName());//java.lang.Object
Object aObj1 = a1;
Object aObj3 = a3;
Object[] aObj33 = a3;
//Object[] aObj11 = a1; //can't convert from int[] to Object[];
Object[] aObj44 = a4; // ar is a Object(String) array.
System.out.println(a1);//[I@10b30a7
System.out.println(a4);//[Ljava.lang.String;@1a758cb
System.out.println(Arrays.asList(a1));//[[I@10b30a7] 将a1作为一个对象传入进去
System.out.println(Arrays.asList(a4));//[a, b, c]
}
private static void changeStringValue(Object obj) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException
{
Field[] fields = obj.getClass().getFields();
for(Field field : fields)
{
if(field.getType() == String.class)
{
String oldValue = (String) field.get(obj);
String newValue = oldValue.replace('b', 'a');
field.set(obj, newValue);
}
}
}
}
class TestArguments
{
public static void main(String[] args)
{
for(String arg : args)
System.out.println(arg);
}
}