黑马程序员技术交流社区
标题: 这个怎么过不了 [打印本页]
作者: 酱爆 时间: 2013-10-7 16:35
标题: 这个怎么过不了
本帖最后由 酱爆 于 2013-10-8 15:29 编辑
- package cn.itcast.day1;
- import java.lang.reflect.Array;
- import java.lang.reflect.Constructor;
- import java.lang.reflect.Field;
- import java.lang.reflect.Method;
- import java.util.Arrays;
- import java.util.*;
- public class ReflectTest {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- try
- {
- String str1 = "abc";
- Class cla1 = str1.getClass();
- Class cla2 = String.class;
- Class cla3 = Class.forName("java.lang.String");
-
- System.out.println(cla1 == cla2); // true 都是同样的字节码
- System.out.println(cla1 == cla3); // true
-
- System.out.println(cla1.isPrimitive()); // false 判断是否为基本类型
-
- System.out.println(int.class.isPrimitive()); // true int是基本类型
-
- System.out.println(int.class == Integer.class); // false int为基本类型,Integer不是基本类型
-
- System.out.println(int.class == Integer.TYPE); //true
-
- System.out.println(int[].class.isPrimitive()); // false
-
- System.out.println(int[].class.isArray()); // true
-
- //需要注意的是,这两个方法都需要类型,getConstructor需要的是的类型而newInstance需要的是相同类型的对象
- Constructor ct1 = String.class.getConstructor(StringBuffer.class); // 通过参数的个数来确定哪个构造方法
- String str2 = (String)ct1.newInstance(new StringBuffer("abc"));
- System.out.println(str2);
-
-
- ReflectPoint pt1 = new ReflectPoint(3,5);
-
- Field fieldY = pt1.getClass().getField("y");
- System.out.println(fieldY.get(pt1)); // fieldY只是对应的字节码,不是对象,要得到对象的值可以用get()方法获取
-
- //Field filedX = pt1.getClass().getField("x"); //error 因为x是私有的,所以不能直接访问
-
- Field filedX = pt1.getClass().getDeclaredField("x");//OK
-
- //System.out.println(filedX.get(pt1)); // x是私有的,不能直接使用 可以用setAccessible(true)方法
- filedX.setAccessible(true);
- System.out.println(filedX.get(pt1));
- changeStringValue(pt1);
- System.out.println(pt1);
- Method methodCharAt = String.class.getMethod("charAt", int.class);
- System.out.println(methodCharAt.invoke(str1, 2));
- //System.out.println(methodCharAt.invoke(null, 2)); // 如果第一个参数为null,那么这个方法必须为static(静态方法)
- System.out.println(methodCharAt.invoke(str1, new Object[]{2}));
-
-
- // 调用一个类的main方法,用普通的方式调用
- //TestArguments.main(new String[]{"11"}); // 普通的方法
-
- String startingClassName = args[0];
-
- Method mainMethod = Class.forName(startingClassName).getMethod("main", String[].class);
-
- mainMethod.invoke(null, (Object)new String[]{"111","222"}); // 这样的话,编译器会作特殊处理,编译时不反参数当作数组看待,也就不会数组打散成若干个参数了
-
- 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() == a3.getClass());
- System.out.println(a1.getClass() == a4.getClass());
-
- System.out.println(a1.getClass().getSuperclass().getName()); // 它们的父类都是Object
- System.out.println(a4.getClass().getSuperclass().getName());
-
- Object b1 = a1;
- Object b2 = a2;
- //Object[] b5 = a1; // 这样是错误的,因为a1是int数组, int 是基本类型, 不是Object的子类
- Object[] b3 = a3; // a3是数组的数组,数组也是Object,所以OK
- Object[] b4 = a4;
-
- System.out.println(a1); // 这样的话,只会等到a1的hashcode,得不到想要的结果
- System.out.println(a4);
-
- System.out.println(Arrays.asList(a1)); // 这里error,jdk1.5会把数组当做一个Object对象,而不是当作若干个
- System.out.println(Arrays.asList(a4)); //OK
-
- printObject(a1);
- printObject("a");
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- finally
- {
-
- }
-
- }
-
- public static void printObject(Object obj)
- {
- Class cls = obj.getClass();
- if (cls.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);
- }
- }
-
-
-
- private static void changeStringValue(Object obj)
- {
- Field[] fields = obj.getClass().getFields();
-
- for (Field field : fields)
- {
- if (field.getType() == String.class)
- {
- try
- {
- String oldValue = (String)field.get(obj);
- String newValue = oldValue.replace('b', 'a');
- field.set(obj, newValue);
-
- } catch (Exception e) {
- // TODO: handle exception
- }
-
- }
- }
- }
- }
- class TestArguments
- {
- public static void main(String[] args)
- {
- for (String arg : args)
- {
- System.out.println(arg);
- }
- }
- }
复制代码
作者: yting_xmei1129 时间: 2013-10-7 21:27
楼主,可以给完整的代码么?不知道你是在弄反射还是在弄代理、、、希望可以把代码弄到代码区那里,好复制,谢谢了
作者: 酱爆 时间: 2013-10-7 23:15
好了,85和84行,你看看是哪出了问题,多谢了!!
作者: 张慧 时间: 2013-10-8 03:58
运算符两边的类型不一致,a1.getClass() == a3.getClass());
a1.getClass() 得到的是Class<int[]>
a3.getClass()得到的是Class<int[][]>
这两个是不同类型的,报错时,你可以看一下他提示的错误信息。
作者: 狼王 时间: 2013-10-8 08:50
每一个具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象。当然不同的类型的数组Class实例对象也不一样。
作者: 狼王 时间: 2013-10-8 08:52
记得改成以解决
作者: 酱爆 时间: 2013-10-8 14:19
老师的视频上好像也是这样写的,为什么我就过不了,是哪个地方写错了?
作者: 狼王 时间: 2013-10-8 22:04
把==改为equals就行了,好多人看视频都出现这个问题,至于老师为什么没出问题,我也不知道,要问高人
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |