「java反射私有」java反射私有方法的异常处理

博主:adminadmin 2023-01-01 06:48:08 1209

今天给各位分享java反射私有的知识,其中也会对java反射私有方法的异常处理进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

Java反射 在只知道类名的情况下,怎样给其中的私有属性赋值

利用反射能

//假设类名为A

// 实例化类

A  p = new A();

// 获取class

Class c = p.getClass();

// 获取该类所有的字段

Field[] fields = c.getDeclaredFields();

// 遍历赋值

for (int i = 0; i  fields.length; i++) {

String filedName = fields[i].getName();

// AccessibleTest类中的成员变量为private,故必须进行此操作

fields[i].setAccessible(true);

// 判断类型

Class? type=fields[i].getType();

//获取字段类型

String typeName=type.getName();

System.out.println(type.getName());

// 对字段进行赋值 第一个参数为对象引用第二个参数为要附的值

//如果为字符串类型

if("java.lang.String".equals(typeName)){

fields[i].set(p, "1");

}

//如果为日期类型

else if("java.util.Date".equals(typeName)){

fields[i].set(p, new Date());

}

else{

fields[i].set(p, 1);

}

}

//楼主我只是简单的写了下。可能还需要判断字段名称以及其他类型什么的。

最后希望楼主多看看java 文档。

java反射机制怎样调用类的私有方法

为了一看就懂,请看下面的示例(假设调用 MyTest类的私有方法 privateMethod()):

public class ReflectionTest {

   

  public static void setObjectColor(Object obj) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAcces***ception, InvocationTargetException{   // 核心代码加粗

    Class cls = obj.getClass();

    //获得类的私有方法

    Method method = cls.getDeclaredMethod("privateMethod", null);

    method.setAccessible(true); //没有设置就会报错

    //调用该方法

    method.invoke(obj, null);

  }

  public static void main(String args[]) throws SecurityException, IllegalArgumentException, NoSuchMethodException, IllegalAcces***ception, InvocationTargetException{

     

    setObjectColor(new MyTest());

  }

}

 //测试类

class MyTest{

   

  public void setMyTest(){

    System.out.println("setMyTest");

  }

  /**

   类的私有方法

   **/

  private void privateMethod(){

    System.out.println("调用了 private Method");

  }

   

}

java反射调用private方法

Java程序不能访问持久化类的private方法,但是利用JAVA的反射机制可以实现调用,代码如下: 

span style="font-size:14px;"

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

public class ReflectDemo {

public static void main(String[] args) throws Exception {

Method method = PackageClazz.class.getDeclaredMethod("privilegedMethod", new Class[]{String.class,String.class});  

method.setAccessible(true);

method.invoke(new PackageClazz(), "452345234","q31234132");

}

}

class PackageClazz {

private void privilegedMethod(String invokerName,String adb) {

System.out.println("---"+invokerName+"----"+adb);

}

}

/span

#程序输出结果为:---452345234----q31234132

什么是java的反射?

Java反射指的是对于任何的一个java类,我们都可以通过反射获取到这个类的所有属性和方法(包含私有的属性方法),使用java反射我们也可以调用一个对象的任何方法。

我们知道Java是一门面向对象编程的语言,我们编程的时候,经常会将类的属性进行封装,然后提供public方法进行属性的设置和获取。类的属性我们通常会设置成private的私有属性,为的就是保护对象属性不被随意的修改和访问。但是反射机制却恰恰相反,通过反射,我们可以获取到这些被保护的属性和方法,并且可以修改和访问他们。

在java中我们可以使用object对象的getClass();方法获得Class的对象classObject;语法格式为 Class classObject = object.getClass() ;可以根据Class对象的方法获取object对象的相关属性和方法;

获取object对象的名字可以使用 classObject.getName();获取类的名称,获取到的结果包含包的名称;

获取object对象的包名称,可以使用classObject.getPackage();获取包的名称;

获取object对象的所有public属性,可以使用classObject.getFields();方法,返回列表是属性类Field[]对象列表;

获取object对象所有属性,可以使用classObject.getDeclaredFields();方法,返回的是所有属性列表(包含private属性);

获取object对象某个特定的属性,可以使用classObject.getField( fieldName );可以根据属性名称获取属性类的对象;

获取object对象private属性,可以使用classObject.getDeclaredField( fieldName );根据属性名获取属性对象信息;

获取object对象public方法,使用classObject.getMethods();可以获取到方法类Method[]对象列表;

获取object对象某个特定的public方法,使用classObject.getMethod( funName , Class... parameterTypes);根据方法名和方法参数类型列表,可以获取到方法类的对象;

获取object对象所有方法(包含private方法);使用classObject.getDeclaredMethods();可以获取所有的方法对象列表;

获取object对象某个特定方法(包含private方法),使用classObject.getDeclaredMethod ( funName, Class... parameterTypes );根据方法名和方法参数类型列表,可以获取到类的特定方法(包含private方法);

获取object对象类中所有的public构造方法,可以使用classObject.getConstructors(); 获取到构造类Constructor的对象列表;

获取object对象类中某个特定的构造方法,可以使用classObject.getConstructor( Class... parameterTypes ); 根据参数类型列表,获取指定的构造函数对象;

获取object对象类中所有的构造方法(包含private),可以使用classObject.getDeclaredConstructors(); 获取到构造类Constructor的对象列表;

获取object对象类中某个特定的构造方法(包含private),可以使用classObject.getDeclaredConstructor( Class... parameterTypes ); 根据参数类型列表,获取指定的构造函数对象;

既然Java反射可以访问和修改私有成员变量,那封装成private还有意义么?

你没发现反射访问是很费力吗?,private的意义就在于没想让人访问,而JAVA反射的开发在于实现这个功能而已,其实在开发之初也没想到你用反射只是为了访问一个私有的变量。

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反射私有的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java反射私有方法的异常处理、java反射私有的信息别忘了在本站进行查找喔。