黑马程序员技术交流社区
标题:
反射方法,调用其他对象中的方法的问题
[打印本页]
作者:
李光耀
时间:
2013-7-20 12:59
标题:
反射方法,调用其他对象中的方法的问题
本帖最后由 李光耀 于 2013-7-21 10:43 编辑
String str =new String("abc");
Method methodCharAt = String.class.getMethod("charAt", int.class);
String s = (String)methodCharAt.invoke(str,1);
//要是打印s报错
//"main" java.lang.ClassCastException: java.lang.Character cannot be cast to java.lang.String
//返回的是Object对象,转成(String)为啥不行呢
//直接打印就可以
System.out.println(methodCharAt.invoke(str,1));
作者:
zhouchao
时间:
2013-7-20 14:13
本帖最后由 zhouchao 于 2013-7-20 14:15 编辑
父类对象不能强制转化成子类对象,java中用类来实例化对象主要是因为类中含有这类实例中的共有属性,而类中集合了这些属性;父类与子类,子类是父类的扩展,子类比父类更具体,意思也就是说,子类比父类所拥有的方法属性更多,更具体,但子类中又包含有父类中的全部属性方法,所以当子类对象强制转化为父类对象是时允许的,因为子类对象中含有与父类对象相同的属性,但是当父类对象强制转化成子类对象时就不可能了 而Object是所有类的父类,所以不能强制转化成String类型
Object obj = (Object)new String("sss");
System.out.println(obj);
这个就可以打印的出来
作者:
草貌路飞
时间:
2013-7-20 14:19
..可以转,父类是可以转成子类的..报错是因为它本质是一个Character类型的对象,然后被转成了Object类对象。所以你把它强制转成String类型的对象就不对了,只能转成Character对象。把String换成Character就行
作者:
董凯
时间:
2013-7-20 14:40
一、反射的基石为class
下面我们用一个特别实际的例子来了解一下
l
Person类代表人,它的实例对象就是张三,李四这样一个个具体的人, Java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是Class。对比提问:众多的人用一个什么类表示?众多的Java类用一个什么类表示?
Ø 人-->Person
Ø Java类-->Class
我们在定义一个普通的Person对象的时候是这样来实现的
Person p1 = new Person();
Person p2 = new Person();
但是如果我们想定义一个class对象是不是也可以像这样扶植呢?
Class cls1 = new Class();?这里我给出答案,是不能这样写的,在java里,是不允许这样赋值的的,同样也没有这种赋值的写法
那么我们该如何来实现呢?
我们来通过字节码来实现,如下
Class cls1 = 字节码;
那么什么是字节码呢?每一个字节码都是一个class的对象
如果说这里有三个对象,分别是:Person,Math,Date
那么我们就可以用字节码来实现
Class cls1 = Date.class;//Date.class代表Date类得字节码
Class cls2 = Person.class;//Person.class代表Person类得字节码
那么又是如何得到各个字节码对应的实例对象
Ø
Ø 类名.class,例如,System.class
Ø 对象.getClass(),例如,new Date().getClass()
Ø Class.forName("类名"),例如,Class.forName("java.util.Date");//做反射的时候做多使用第三种
现在可以说是该了解的都已经了解了,那么我们来通过一个小的程序段来更好的了解反射
package cn.itcast.day1;
import java.lang.reflect.Constructor;
public class ReflectTest {
public static void main(String[] args) throws Exception
{
String str1 = "abc";
Class cls1 = str1.getClass();
Class cls2 = String.class;
Class cls3 = Class.forName("java.lang.String");
System.out.println(cls1 == cls2);
System.out.println(cls1==cls3);
System.out.println(cls1.isPrimitive());//isPrimitive 判定指定的 Class 对象是否表示一个基本类型。打印结果为:false
System.out.println(int.class.isPrimitive());//输出结果为:true
System.out.println(int.class==Integer.class);//输出结果为false
System.out.println(int.class==Integer.TYPE);//TYPE表示基本类型 int 的 Class 实例,输出结果为:true
System.out.println(int[].class.isPrimitive());//输出结果为:false
System.out.println(int[].class.isArray());//isArray判定此 Class 对象是否表示一个数组类。输出结果为:true
Constructor constructor1 = String.class.getConstructor(StringBuffer.class);
String str2 = (String)constructor1.newInstance(new StringBuffer("abc"));
//String str2 = (String)constructor1.newInstance("abc");Exception in thread "main" java.lang.IllegalArgumentException: argument type mismatch
System.out.println(str2.charAt(2));//输出abc中的第二个字符,输出结果为c
}
}
复制代码
作者:
wedge
时间:
2013-7-20 16:08
不是因为object对象不能转成String对象,而是因为这个object的引用指向的对象的本质不是String
类的对象。所以它才不能转成String对象,所以在强制转换的时候,父类转成子类对象时,一定得
确定子类对象的类型,要不然就转不了。所以只能转成object的子类对象Character!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2