public class ReflectPoint { private int x; public int y; public String str1 = "ball"; public String str2 = "basketball"; public String str3 = "itcast"; public ReflectPoint(int x, int y) { super(); this.x = x; this.y = y; } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } }
?
import java.io.FileInputStream; import java.io.InputStream; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Properties; /* * HashSet 先判断是否存在该对象,如果存在则不放, * ArrayList是有顺序的,可以任意改变序号,人一个都可以放进去 */ public class ReflectTest2 { public static void main(String[] args) throws Exception{ /* * 配置文件的路径应该是相对与工程的目录,跟class和源文件的位置没有关系 * 一定要用完整的路径,地址是运算出来的 */ InputStream ips = new FileInputStream("config.properties"); Properties props = new Properties(); props.load(ips); ips.close(); String str = props.getProperty("className"); Collection conllections = (Collection)Class.forName(str).newInstance(); //Collection conllections = new ArrayList(); //Collection conllections = new HashSet(); ReflectPoint pt1 =new ReflectPoint(3,3); ReflectPoint pt2 =new ReflectPoint(5,5); ReflectPoint pt3 =new ReflectPoint(3,3); conllections.add(pt1); conllections.add(pt2); conllections.add(pt3); conllections.add(pt1); System.out.println(conllections.size()); } }
?
import java.lang.reflect.Array; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Arrays; public class ReflectTest { public static void main(String[] args) throws Exception{ String str1 = "abc"; Class cls1 = str1.getClass(); Class cls2 = String.class; Class cls3; cls3 = Class.forName("java.lang.String"); //字节码都是指向同一份——内存中的那个,所以下面的全部相等 System.out.println(cls1 == cls2); System.out.println(cls2 == cls3); //判断某个类是否是基本类型 System.out.println(cls1.isPrimitive()); System.out.println(int.class.isPrimitive()); System.out.println(int.class == Integer.class); //TYPE属性反映的是基本类型的那份字节码 System.out.println(int.class == Integer.TYPE ); //数组也是一种类型 System.out.println(int[].class.isPrimitive()); //判断某个对象或者类是否是数组类型用isArray()方法 System.out.println(int[].class.isArray()); //new String(new StringBuffer("dsaf")); //Class --> Constructor --> Object //获得方法时要用的类型 Constructor construct1 = String.class.getConstructor(StringBuffer.class); String str2 = (String)construct1.newInstance(new StringBuffer("abc")); System.out.println(str2); ReflectPoint pt1 = new ReflectPoint(3,5); Field fieldY = pt1.getClass().getField("y"); //fieldY不是对象上的变量,而是类上,要用它去取某个对象上对应的Z值 System.out.println(fieldY.get(pt1)); Field fieldX = pt1.getClass().getDeclaredField("x");//让某个对象 fieldX.setAccessible(true);// System.out.println(fieldX.get(pt1)); //更改对象里面的属性,将a改为b changeStringValue(pt1); System.out.println("pt1.str1:" + pt1.str1); System.out.println("pt1.str2:" + pt1.str2); System.out.println("pt1.str3:" + pt1.str3); //str.charAt(1) //包名如果是用java打头的是标准,如果是用com打头则是公司所用 Method methodCharAt = String.class.getMethod("charAt", int.class); System.out.println(methodCharAt.invoke(str1, 2)); System.out.println(methodCharAt.invoke(str1, new Object[]{2})); //TestArguments.main(new String[]{new String("123"),new String("abc"),new String("xyz")}); String startingClassName = args[0]; Method mainMethod = Class.forName(startingClassName).getMethod("main", String[].class); /* * 这里必须封装一层Object数组,在invoke方法中会拆开,然后出现对象new String[]{new String("123"), * new String("abc"),new String("xyz")}一个string[]数组对象 * 如果没有封装,则在invoke方法中直接拆开则参数会是new String("123"),new String("abc"),new String("xyz")三个对象 */ mainMethod.invoke(null,new Object[]{new String[]{new String("123"),new String("abc"),new String("xyz")}}); int [] a1 = new int[]{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()); System.out.println(a1.getClass().getName()); System.out.println(a1.getClass().getSuperclass().getName()); System.out.println(a1.getClass() == a4.getClass()); System.out.println(a3.getClass().getName()); System.out.println(a4.getClass().getSuperclass().getName()); System.out.println(a1.getClass() == a3.getClass()); //将数组遍历的方法Arrays.asList(),该类在utils包中 System.out.println(a1); System.out.println(a4); //asList()方法对int类型不转换 System.out.println(Arrays.asList(a1)); System.out.println(Arrays.asList(a4)); printObject(a4); printObject("xyz"); } /* * 对象的属性一定要是公共的,否则无法操作该属性的值 */ public static void changeStringValue(Object obj) throws Exception{ Field[] fields = obj.getClass().getFields(); System.out.println(fields.length); for(Field field : fields){ //字节码只有一份,所以用==比较 if(field.getType() == String.class){ String odlStr = (String)field.get(obj); String newValue = odlStr.replace('b', 'a'); field.set(obj, newValue); } } } public static void printObject(Object obj){ Class clazz = obj.getClass(); if(clazz.isArray()){ int len = Array.getLength(obj); for(int i = 0; i < len; i++){ System.out.println(Array.get(obj, i)); } }else{ System.out.println(obj); } } } class TestArguments{ public static void main(String[]args){ for(String arg : args){ System.out.println(arg); } } }
?config.properties
className=java.util.ArrayList
?