反射机制访问私有方法代码异常"java.lang.ClassCastException"

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反射机制访问私有方法代码异常"java.lang.ClassCastException"相关的知识,希望对你有一定的参考价值。

package com.testspring.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

class PrivateCar
//①private成员变量:使用传统的类实例调用方式,只能在本类中访问
private String color;
//②protected方法:使用传统的类实例调用方式,只能在子类和本包中访问
protected void drive()

System.out.println("drive private car! the color is:"+color);



public class PrivateCarReflect
public static void main(String[] args) throws Throwable
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class clazz = loader.loadClass("com.baobaotao.reflect.PrivateCar");
PrivateCar pcar = (PrivateCar)clazz.newInstance();

Field colorFld = clazz.getDeclaredField("color");
//①取消Java语言访问检查以访问private变量
colorFld.setAccessible(true);
colorFld.set(pcar,"红色");

Method driveMtd = clazz.getDeclaredMethod("drive",(Class[])null);
//Method driveMtd = clazz.getDeclaredMethod("drive"); JDK5.0下使用

//②取消Java语言访问检查以访问protected方法
driveMtd.setAccessible(true);
driveMtd.invoke(pcar,(Object[])null);



PrivateCar pcar = (PrivateCar)clazz.newInstance();这一行出错了,提示cannot be cast to PrivateCar 这是为什么啊?请教各位,谢谢了

参考技术A Class clazz = loader.loadClass("com.baobaotao.reflect.PrivateCar");
PrivateCar pcar = (PrivateCar)clazz.newInstance(); // package com.testspring.reflect;

虽然类名相同,但包名不同,不是同一个类,所以不能转换。

Java中只有类的和包名完全相同,才是同一个类。

改为:
com.baobaotao.reflect.PrivateCar pcar = (com.baobaotao.reflect.PrivateCar)clazz.newInstance();
或者
Class clazz = loader.loadClass("com.testspring.reflect.PrivateCar");本回答被提问者和网友采纳

以上是关于反射机制访问私有方法代码异常"java.lang.ClassCastException"的主要内容,如果未能解决你的问题,请参考以下文章

Java 反射机制 Bug

Java反射设置和访问私有属性值

Java反射机制

java反射机制可以调用到私有方法,是否就破坏了JAVA的卦装性呢。

Java反射机制-Declared区别

怎样通过反射机制调取内部类的私有方法