「java暴力反射」java暴力反射访问私有变量

博主:adminadmin 2022-12-11 11:06:11 71

本篇文章给大家谈谈java暴力反射,以及java暴力反射访问私有变量对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

java,反射里,关于反射机制下列说法错误的是( )

B、反射机制指的是在程序编译期间,通过“.class”文件加载并使用一个类的过程。

假如有两个程序员,一个程序员在写程序的时候,需要使用第二个程序员所写的类,但第二个程序员并没完成他所写的类。这是不能通过编译的。利用Java反射的机制,就可以让第一个程序员在没有得到第二个程序员所写的类的时候,来完成自身代码的编译。

Java中编译类型有两种:

静态编译:一次性编译。在编译的时候把你所有的模块都编译进去。

动态编译:按需编译。程序在运行的时候,用到那个模块就编译哪个模块。

如果不理解,那么给个业务场景帮助你理解:比如开发一个阅读器,支持txt,pdf,doc三种格式。我们把读txt,读pdf,读doc定义为三个功能模块。

java 反射非基本类型的成员?

这样?

public class T {

public static void main(String[] args) throws

IllegalAccessException,

InstantiationException,

NoSuchFieldException {

B b = new B();

//先输出value的值 是20

System.out.println(b.getA().getValue());

//反射B的属性a

Field fieldA = b.getClass().getDeclaredField("a");

fieldA.setAccessible(true);//暴力反射,解除私有限制

//反射构造一个对象A

Object objectA = fieldA.getType().newInstance();

//反射A的属性value

Field fieldValue = fieldA.getType().getDeclaredField("value");

fieldValue.setAccessible(true);//暴力反射,解除私有限制

//设置value的值为30

fieldValue.set(objectA, 30);

//更新B的a

fieldA.set(b, objectA);

System.out.println(b.getA().getValue());

}

}

class A {

private int value = 20;

public int getValue() {

return value;

}

}

class B {

private A a = new A();

public A getA() {

return a;

}

}

运行结果:

Java暴力反射练习为啥报错

m.invoke(t,m);

这个调用出错了,应该改成m.invoke(t,null);

因为方法没有参数,你再试试

怎么把一个javabean里面的属性封装成map集

package bean;

import java.lang.reflect.Field;

import java.util.HashMap;

import java.util.Map;

/**

 * 测试类,这里考虑的是简单的javaBean属性,即属性类型没有复杂类型

 * 

 * 概述: 采用反射机制读取属性并存储

 * 

 * 相关搜索词: 1你可以了解下java的内省机制。 

 * 2还有一些工具包,例如BeanUtils、PropertyUtils等(对象拷贝等)。

 * 3还有一些开源工具可以对象与map互转,驼峰排序等。

 */

public class Test {

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

// 存储map

MapString, Object map = new HashMapString, Object();

// 创建对象

User user = new User("remind", "080440422");

// 获取对象属性

Field[] fields = user.getClass().getDeclaredFields();

for (Field field : fields) {

// 私有属性,设置暴力反射

field.setAccessible(true);

map.put(field.getName(), field.get(user));

}

// map展示

for (String key : map.keySet()) {

System.out.println(key + "   " + map.get(key));

}

}

}

package bean;

/**

 * 简单的javabean示例

 * @author remind

 *

 */

public class User {

private String name;

private String id;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public User(String name, String id) {

super();

this.name = name;

this.id = id;

}

public User() {

super();

// TODO Auto-generated constructor stub

}

}

天下武功,以快为最。

反射和设计模式(笔记)

1. 什么是反射及作用

动态获取类或对象信息以及动态调用对象方法的机制

作用:

获取类或接口的包名,类名,修饰符类型 获取类所包含的成员信息

白话文: 在java程序运行的时候,我们可以拿到一个类的任意方法及变量,

并且可以调用任意方法,更改任意变量

应用最广泛的地方:

配合注解使用,注解的底层都是反射.

2. 使用反射获取Class****对象的三种方式

a. Class的forName() --- Class.forName(“com.bwie.Student”)//参数是全类名

b. 对象的getClass() --- new Student().getClass()

c. 类的class属性 --- Student.class

3. 获取Class****对象对应类所包含的构造方法 (构造器Constructor****)

getConstructor() 获取一个由public修饰的构造函数

getConstructors() 获取所有由public修饰的构造函数

getDeclaredConstructor() 获取一个非公共的构造函数 (包含私有 公共)

getDeclaredConstructors() 获取所有的构造函数 (包含私有 公共)

4. 获取Class****对象对应类所包含的成员变量 (属性Field****)

getField() 获取一个由public修饰的成员变量

getFields() 获取所有由public修饰的成员变量

getDeclaredField() 获取一个非公共的成员变量 (包含私有 公共)

getDeclaredFields() 获取所有的成员变量 (包含私有 公共)

5. 获取Class****对象对应类所包含的成员方法 (属性Method****)

getMethod() 获取一个由public修饰的成员方法

getMethods() 获取所有由public修饰的成员方法

getDeclaredMethod() 获取一个非公共的成员方法 (包含私有 公共)

getDeclaredMethods() 获取所有的成员方法 (包含私有 公共)

获取Class****对象的修饰符类型Modifier

6. 通过反射创建对象的两种方式

a. 使用Class对象的newInstance()

如 Class? cls = Student.class

cls.newInstance() 注意:该方式只能通过无参构造创建对象

b. 使用Constructor对象的newInstance()

如 Class? cls = Student.class

Constructor con = cls.getConstructor()

con.newInstance(注意:该方式可以通过无参构造和有参构造来创建对象)

7. 使用反射访问成员方法

通过Method****类的invoke()****方法进行方法调用

//访问权限的设置 当我们想调用私有方法,更改私有属性的时候,必须先把

该方法/该属性,设置如下(暴力反射)

xxx.setAccessible(true)

8. 什么是设计模式

软件开发过程中共性问题的可重用解决方案

外延:单例模式 工厂模式 适配器模式 代理模式(动态代理和静态代理)

单例模式确保一个类只能创建一个实例的设计模式

9. 设计模式小结

个人笔记仅供参考!

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

The End

发布于:2022-12-11,除非注明,否则均为首码项目网原创文章,转载请注明出处。