如何根据注解创建新对象

问题描述

碰到一个任务, 需要根据注解来创建一个新对象,而不能使用new关键字. 在取得注解的内容后,不知道如何根据注解内容来生成一个新的User对象?package annopractise;import java.lang.reflect.Field;public class UserAnnoTest { @UserAnno(id = 13, name = "sanan") public User user; public UserAnnoTest() throws ClassNotFoundException { Class<?> cl = UserAnnoTest.class; for (Field field : cl.getFields()) { UserAnno userAnno = field.getAnnotation(UserAnno.class); if (userAnno != null) { [color=red]// 此处该如何继续, 这里已经得到注解内容, 但是不知道如何创建User对象[/color] } } } @Override public String toString() { return user.toString(); } public static void main(String[] args) throws ClassNotFoundException { UserAnnoTest annoTest = new UserAnnoTest(); System.out.println(annoTest); }}User和UserAnno的代码如下:package annopractise;public class User { int id; String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "id: " + id + "tname: " + name + "n"; }}package annopractise;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface UserAnno { int id(); String name() default "";} 问题补充:Wind_ZhongGang 写道

解决方案

还可以这样做 Class<User> userClass = User.class; Constructor<User> constructor = userClass.getConstructor(); user = constructor.newInstance(); user.setId(id); user.setName(name);但是记住,如果User中有多个构造方法,一定记得申明一个无参的构造方法,如果一个构造方法都没有的话就不用担心。还有获取类属性应该用这个方法 Field[] fields = clazz.getDeclaredFields(); 我使用你提供的getFields方法无任何返回值,具体原因还在查。
解决方案二:
显然 通常这个User通常是不会引入到类中的,而其注解是需要的,因为它是解析的元数据,算是入口,所以可以这样写,来实现注解的功能,即把构造延迟到应用程序的解析上public static void main(String[] args) throws Exception {Class<?> cl = UserAnnoTest.class;for (Field field : cl.getFields()) {UserAnno ano = field.getAnnotation(UserAnno.class);if (ano != null) {Class<?> filedType = field.getType();Object f = filedType.newInstance();Method m = f.getClass().getMethod("setName", String.class); // 可以根据UserAnno字段來动态获取m.invoke(f, ano.name());Method m2 = f.getClass().getMethod("setId", int.class); // 可以根据UserAnno字段來动态获取m2.invoke(f, ano.id());System.out.println(f);}}}
解决方案三:
getFields()只能访问类中声明为公有的字段,私有的字段它无法访问.getDeclaredFields()能访问类中所有的字段,与public,private,protect无关sorry,看错,原来你的user是public的。是我搞错了,我申明成private的了。
解决方案四:
package com.annotation;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;/** * Created by IntelliJ IDEA. * User: Zhong Gang * Date: 8/19/11 * Time: 3:27 PM */public class Main { @UserAnno(id = 1, name = "ZhongGang") private User user; public Main() { Class<Main> clazz = Main.class; Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { UserAnno annotation = field.getAnnotation(UserAnno.class); if (annotation != null) { int id = annotation.id(); String name = annotation.name(); try { Class<User> userClass = User.class; Constructor<User> constructor = userClass.getConstructor(Integer.class, String.class); user = constructor.newInstance(id, name); } catch (InstantiationException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } catch (IllegalAccessException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } catch (NoSuchMethodException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } catch (InvocationTargetException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } } } } public static void main(String[] args) { Main main = new Main(); System.out.println(main.toString()); } public String toString() { return user.toString(); }}User中记得添加User的构造方法public User(Integer id, String name) { this.id = id; this.name = name; }

时间: 2024-11-13 06:37:26

如何根据注解创建新对象的相关文章

javascript对象中创建新对象问题

问题描述 var TestObject = Class.create();TestObject.prototype = { data: new Array(), initialize: function(){ }}var ss = new TestObject();ss.data.push("AAA");alert(ss.data.length);为什么多次执行(总是创建新对象后,向对象data数组里,加入一条数据)var ss = new TestObject();ss.data.p

&amp;#106avascript技术讲座-创建新对象

创建|对象 使用JavaScript可以创建自己的对象.虽然JavaScript内部和浏览器本身的功能已十分强大,但JavaScript还是提供了创建一个新对象的方法.使其不必像超文本标识语言那样,求于或其它多媒体工具,就能完成许多复杂的工作. 在JavaScript中创建一个新的对象是十分简单的.首先它必须定义一个对象,而后再为该对象创建一个实例.这个实例就是一个新对象,它具有对象定义中的基本特征. 一.对象的定义 JavaScript对象的定义,其基本格式如下: Function Objec

在JavaScript中创建新对象

使用JavaScript可以创建自己的对象.虽然JavaScript内部和浏览器本身的功能已十分强大,但JavaScript还是提供了创建一个新对象的方法.使其不必像超文本标识语言那样,求于或其它多媒体工具,就能完成许多复杂的工作. 在JavaScript中创建一个新的对象是十分简单的.首先它必须定义一个对象,而后再为该对象创建一个实例.这个实例就是一个新对象,它具有对象定义中的基本特征. 一.对象的定义 JavaScript对象的定义,其基本格式如下: Function Object(属性表)

Javascript创建自定义对象:创建Object实例添加属性和方法

文章简介:创建自定义对象的最简单的方式就是创建一个Object实例,然后再为它添加属性和方法. 创建自定义对象的最简单的方式就是创建一个Object实例,然后再为它添加属性和方法,如下所示: var person = new Object(); person.name = "Nicholas"; person.age = "29" person.job = "Software Engineer"; person.sayName = functio

Javascript创建自定义对象 创建Object实例添加属性和方法_javascript技巧

如下所示: 复制代码 代码如下: var person = new Object(); person.name = "Nicholas"; person.age = "29" person.job = "Software Engineer"; person.sayName = function () { alert(this.name); }; person.sayName();上面的例子创建了一个名为person的对象,并为它添加了三个属性(n

《ActionScript 3.0基础教程》——第1章 对象的访问和操作1.1 创建新的ActionScript 3.0项目

第1章 对象的访问和操作 ActionScript让每个人都可以为图画.视频以及其他舞台上的元件创建动画交互.为了增加交互功能,ActionScript需要一种方法来访问舞台上的各个对象.在这一部分里,你将学会如何访问这些对象,之后你就可以为它们添加简单的交互了. 在本章中,你将学会如何修改舞台上对象的属性.在学习的过程中,你会发现把对象转化为元件并为它们命名(我们叫它实例名)是多么重要.你将写出你的第一段ActionScript代码来改变一些东西,并且你将知道如何输出开发信息来帮助你检查代码的

垃圾回收- 新人学java 想问一下怎么把创建的对象给清空

问题描述 新人学java 想问一下怎么把创建的对象给清空 这个我想问一下我不是已经让他等于null了吗 怎么还可以执行sayhello 如果有错误的话还麻烦告诉一下我需要创建大量相同的对象 怎么能不通过垃圾回收手动清空这个对象 解决方案 java是值传递,而不是引用传递. 如你的程序:是将内存空间中cc所指向的那个存储单元中存放的值,即c对象传送给了remove()方法中的x变量,而这个c对象也在内存空间中分配了一个存储单元,这个时候,就把c的对象传送给了这个存储单元中.此后,在remove()

C#引擎方式调用Matlab,每次都创建新的实例,而不是引用其他已存在的对象

问题描述 最近用C#调用Matlab引擎,因为两段M代码没有关联,想同时启动两个Matlab引擎同时执行,代码如下:MLApp.MLAppmatlab=null;MLApp.MLAppmatlab1=null;TypematlabAppType=System.Type.GetTypeFromProgID("Matlab.Application");matlab=System.Activator.CreateInstance(matlabAppType)asMLApp.MLApp;mat

《Android游戏开发详解》——第2章,第2.11节创建新的对象变量

2.11 创建新的对象变量Android游戏开发详解我们想要使用Phone类作为蓝图,创建一个新的Phone对象.为了做到这点,我们使用如下所示的语法. Phone myPhone = new Phone(); 使用我们前面用来创建基本类型变量相同的方式,来创建一个对象变量.首先声明对象变量的类型(Phone),然后指定一个名称(myPhone),最后赋值. 语法的不同之处在于最后一步.要创建一个新的Phone对象,我们必须使用Java的内建关键字new,并且声明我们想要用来创建Phone对象的