「java暴力反射」java暴力反射访问私有变量
本篇文章给大家谈谈java暴力反射,以及java暴力反射访问私有变量对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、java,反射里,关于反射机制下列说法错误的是( )
- 2、java 反射非基本类型的成员?
- 3、Java暴力反射练习为啥报错
- 4、怎么把一个javabean里面的属性封装成map集
- 5、反射和设计模式(笔记)
- 6、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暴力反射的信息别忘了在本站进行查找喔。
发布于:2022-12-11,除非注明,否则均为
原创文章,转载请注明出处。