㈠ java中私有属性可以通过反射获取,那设置成私有是不是没多大意思
私有、公有这些访问控制,主要是针对类的扩展或子类化设置的,针对现实世界的抽象和封装。
一般都是一些Web框架需要用反射,日常代码里面一般不用,用到的时候一般来说破坏了面向对象的特性。
㈡ java 反射 能直接对私有属性赋值么不通过set方法
设置
A a = new A();
Field field = a.getClass().getDeclaredField("x");
field.setAccessible(true);
field.set(a, 1);
读取
Field f = a.getClass().getDeclaredField("x");
f.setAccessible(true);
System.out.println(f.get(a));
㈢ java中,利用反射可以调用私有的属性,那么私有还有什么意义,求大神解答。
因为现实世界中,都没有绝对的限制,而且有很多奇葩的需求,说不定什么时候就需要破坏原有的结构,反射在特定条件下是必要的
㈣ java里一个私有的属性如何在其他类里面进行访问
既然是私有属性就不建议直接访问的,一般会提供方法来访问私有属性,这样可以在方法中对属性的访问做一些控制。
当然也可以通过反射来直接访问。
我们准备一个包含私有属性的类
然后通过反射来访问属性,记得一定要加aField.setAccessible(true);这句代码,不然就不能访问私有属性。
不加aField.setAccessible(true);
加了aField.setAccessible(true);
㈤ 一个java对象的属性是私有的,而且没有提供public的get和set方法,可以用反射的方式将其转成json吗
如果提供了get和set方法是可以实现的,因为变量是私有的,只能通过外部公用方法去访问这些变量,如果没有这些方法就只能通过本类访问,其他类没有办法访问
㈥ Java通过反射可以设置私有变量的好处有哪
Java通过反射可以设置私有变量的好处有
public class PrivateTest { private String name = "hello"; public String getName() { return name; } } public class ReflectionTest { public static void main(String[] args) throws Exception { PrivateTest pt = new PrivateTest(); Class clazz = PrivateTest.class; Field field = clazz.getDeclaredField("name"); field.setAccessible(true); field.set(pt, "world"); field.setAccessible(false); System.out.println(pt.getName()); } } 这样通过反射可以设置私有变量,Java当时设计的时候是出于什么考虑的呢?
但是也有应用的场景,可以想到的是: hibernate中你定义实体类及相应的字段(和数据库表对应),你可以在映射文件中配置: 当你从数据库中获取到数据后,是调用类的setxxx()方法,还是直接给字段赋值,这里字段是可以设置成private的,用的就是反射。那java反射可以设置私有变量的值,是好处多还是坏处多呢? 问题补充:robertliudeqiang 写道提供了一种接口吧,一般情况下不会用的。
但是也有应用的场景,可以想到的是: hibernate中你定义实体类及相应的字段(和数据库表对应),你可以在映射文件中配置: 当你从数据库中获取到数据后,是调用类的setxxx()方法,还是直接给字段赋值,这里字段是可以设置成private的,用的就是反射。目前反射设置private变量的值,还未看出是有好处 的。
那应该是java的一个问题遗留,为了兼容没法解决的。
㈦ Java版《我的世界》Forge反射找不到私有方法和属性名是什么原因
你好,很高兴回答你的问题。
试试getDeclaredFields和getDeclaredMethods。
如果有帮助到你,请点击采纳。
㈧ java反射机制怎么判断一个属性是否为私有属性
private,public类似与 WEB系统中管理员,普通用户权限 . 是一种权限安全机制 反射的主要目的并不在与看到私有方法,更重要的是能在运行时可以动态自查自己的结构,在开发某些功能时特别有用, 例如:(1)把XML节点自动映射后JAVA BEAN中.
㈨ java反射访问私有方法的的问题
java的反射可以绕过访问权限,访问到类的私有方法和成员。可能这点会引起安全性的讨论。反射的使用帮助解决很多复杂的问题,其运行时的类型检查,动态调用,代理的实现等,反射为我们写程序带来了很大的灵活性,很多功能都是基于反射。
利用反射还可以访问内部类、匿名内部类的私有属性。
用java自带的java -private 类名 反编译命令可以查看类的完整定义。(参考think in java)
下面举例子说明。首先定义一个接口
Java代码
public interface Ref {
public void f();
}
public interface Ref {
public void f();
}
接口的实现类
Java代码
public class RefImpl implements Ref {
//实现接口方法
public void f() {
System.out.println("public method f()");
}
void g(String args){
System.out.println("package method g():" + args);
}
private void w(){
System.out.println("private method w()");
}
}
public class RefImpl implements Ref {
//实现接口方法
public void f() {
System.out.println("public method f()");
}
void g(String args){
System.out.println("package method g():" + args);
}
private void w(){
System.out.println("private method w()");
}
}
测试类
Java代码
public class TestRef {
public static void main(String[] args) {
Ref ref = new RefImpl();
System.out.println(ref.getClass().getSimpleName()); //RefImpl类型
ref.f(); //调用接口方法
// ref.g(); //向上转型后实现类添加的方法不能调用
if(ref instanceof RefImpl){
RefImpl ref1 = (RefImpl)ref; //类型识别后转型
ref1.g("zhouyang");
// ref1.w(); //私有方法不能访问
}
//通过反射调用方法
try {
Ref ref2 = new RefImpl();
Method m = ref2.getClass().getDeclaredMethod("f");
Method m1 = ref2.getClass().getDeclaredMethod("g", String.class);//有参的方法
Method m2 = ref2.getClass().getDeclaredMethod("w");
System.out.println("==============");
m.invoke(ref); //调用方法f()
m1.invoke(ref, "yangzhou");
m2.setAccessible(true);///调用private方法的关键一句话
m2.invoke(ref);
} catch (Exception e) {
e.printStackTrace();
}
//java的javap反编译能够查看类的信息,-private 开关能够打开所有信息
//javap -private 类名 类必须是编译成.calss 文件
//利用反射访问私有成员,改变私有成员值,但是final域可以访问不可改变
PrivateField pf = new PrivateField();
// ps.ss; //私有成员不能访问
//打印原来的成员值
pf.print();
try {
//反射访问和改变原来值
Field[] f = pf.getClass().getDeclaredFields();
for(int i=0;i<f.length;i++){
f[i].setAccessible(true);
System.out.println(f[i].getType());//打印字段类型
System.out.println(f[i].get(pf)); //打印值
if("ss".equals(f[i].getName())){
f[i].set(pf, "hehe"); //修改成员值
}else{
f[i].setInt(pf, 55);
}
}
//重新打印修改后的成员值,final域值不变
pf.print();
} catch (Exception e) {
e.printStackTrace();
}
/*打印输出的结果
* RefImpl
public method f()
&nb
㈩ Java反射 在只知道类名的情况下,怎样给其中的私有属性赋值
利用反射能
//假设类名为A
//实例化类
Ap=newA();
//获取class
Classc=p.getClass();
//获取该类所有的字段
Field[]fields=c.getDeclaredFields();
//遍历赋值
for(inti=0;i<fields.length;i++){
StringfiledName=fields[i].getName();
//AccessibleTest类中的成员变量为private,故必须进行此操作
fields[i].setAccessible(true);
//判断类型
Class<?>type=fields[i].getType();
//获取字段类型
StringtypeName=type.getName();
System.out.println(type.getName());
//对字段进行赋值第一个参数为对象引用第二个参数为要附的值
//如果为字符串类型
if("java.lang.String".equals(typeName)){
fields[i].set(p,"1");
}
//如果为日期类型
elseif("java.util.Date".equals(typeName)){
fields[i].set(p,newDate());
}
else{
fields[i].set(p,1);
}
}
//楼主我只是简单的写了下。可能还需要判断字段名称以及其他类型什么的。
最后希望楼主多看看java 文档。