「java动态设置实例属性」java 动态属性

博主:adminadmin 2022-11-30 20:17:08 156

本篇文章给大家谈谈java动态设置实例属性,以及java 动态属性对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

JAVA怎么给一个对象动态添加属性

给某个对象动态不了属性的

但是可以通过集合类来实现

例如你可以用Map这个类来实现

map.put(key,value);

键值对都是泛型

之后通过map.get(key);来获取

java什么叫类属性 实例属性 以及区别

一个是类的方法(也叫动态属性)和属性(静态属性),通过类名来访问

一个是对象的方法和属性,需要通过一个实例来访问。

静态属性程序一加载时 就初始化 存放在栈中

实例属性 需要实例化后 才加载 存放在堆中

java 可以动态创建 属性字段么

可以的,你用 javassist, cglib 或者更为底层的工具 ASM 都是可以。

ASM 的话相对复杂一些,参考代码:

下面这个是用 ASM 工具为 Student 类添加一个 public String 类型的 address 属性:

1,需要添加属性的原始类:Student.java

Java code?

public class Student {

private int age;

private String name;

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

2,添加属性的适配器:AddFieldAdapter.java

Java code?

import org.objectweb.asm.ClassAdapter;

import org.objectweb.asm.ClassVisitor;

import org.objectweb.asm.FieldVisitor;

public class AddFieldAdapter extends ClassAdapter {

private int accessModifier;

private String name;

private String desc;

private boolean isFieldPresent;

public AddFieldAdapter(ClassVisitor cv, int accessModifier, String name, String desc) {

super(cv);

this.accessModifier = accessModifier;

this.name = name;

this.desc = desc;

}

@Override

public FieldVisitor visitField(int access, String name, String desc,

String signature, Object value) {

if (name.equals(this.name)) {

isFieldPresent = true;

}

return cv.visitField(access, name, desc, signature, value);

}

@Override

public void visitEnd() {

if (!isFieldPresent) {

FieldVisitor fv = cv.visitField(accessModifier, name, desc, null, null);

if (fv != null) {

fv.visitEnd();

}

}

cv.visitEnd();

}

}

3,添加属性的工具 AddField.java

Java code?

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;

import org.objectweb.asm.ClassAdapter;

import org.objectweb.asm.ClassReader;

import org.objectweb.asm.ClassWriter;

import org.objectweb.asm.Opcodes;

public class AddField {

private Class clazz = null;

private ClassReader cr = null;

private ClassWriter cw = null;

private ClassAdapter ca = null;

private File classFile = null;

private final static String CLASS_FILE_SUFFIX = ".class";

public AddField(Class clazz) {

this.clazz = clazz;

}

/**

* 添加一个 public 的类成员

* @param fieldName 类成员名

* @param fieldDesc 类成员类型描述

*/

public void addPublicField(String fieldName, String fieldDesc) {

if(cr == null) {

try {

cr = new ClassReader(clazz.getCanonicalName());

} catch (IOException e) {

e.printStackTrace();

}

cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS);

}

if(ca == null) {

ca = new AddFieldAdapter(cw, Opcodes.ACC_PUBLIC, fieldName, fieldDesc);

} else {

ca = new AddFieldAdapter(ca, Opcodes.ACC_PUBLIC, fieldName, fieldDesc);

}

}

/**

* 将字节码写入类的 .class 文件

*

*/

public void writeByteCode() {

cr.accept(ca, ClassReader.SKIP_DEBUG);

byte[] bys = cw.toByteArray();

OutputStream os = null;

try {

os = new FileOutputStream(getFile());

os.write(bys);

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

os.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

/**

* 获得类文件的 File 对象

* @return

*/

private File getFile() {

if(classFile == null) {

StringBuffer sb = new StringBuffer();

sb.append(clazz.getResource("/"))

.append(clazz.getCanonicalName().replace(".", File.separator))

.append(CLASS_FILE_SUFFIX);

classFile = new File(sb.substring(6));

}

return classFile;

}

}

怎么给java对象添加动态添加属性和方法

Java无法动态添加方法和属性。

Java是一门编译性的语言,常见脚本语言是解析性语言。

编译性语言的类的成员与属性在代码编译完成后就已经固定了,无法动态添加;

解释性语言是在运行时可以动态为对象添加属性和方法。

java中怎么动态的给类的属性赋值

利用java的反射机制可以做到:

Object instance = beanClass.newInstance();//beanClass自定义class

Method setJobName = beanClass.getMethod("setJobName", String.class);

method.invoke(instance, "Super Cool Job");//开始设置值。

javaweb项目中关于动态设置属性?

思路如下,你在遍历控件的时候,每个控件设置的ID为唯一编号,设置控件点击事件,传递对应的参数过去,在新的方法中,进行状态改变的操作,你之所以出现这种情况,应该是由于ID相同了导致的

关于java动态设置实例属性和java 动态属性的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

The End

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