怎么动态给java注解参数赋值

怎么动态给java注解参数赋值,第1张

动态赋值指的是在配置文件配置好然后在项目中动态读取?如果是这样的话:

1在xml文件中使用<context:property-placeholder location="”/>

这种方式可以读取location指定位置对应的文件,引用的话使用${key}可以获取对应的数据

和这种写法相同的还有

<bean class=“comspring…configPropertyPlaceholderConfigurer”>

<property name=“locations">

<array><value></value></array>

</property>

<bean>

这种是用bean来加载配置文件,看起来更直观

2通过@Value注解读取配置

这种方法也需要预先在xml文件中设定好配置文件的位置

<bean id=“prop” class=“orgspringframeworkbeansfactoryconfigPropertiesFactoryBean”>

<property name=“locations”>

<array>

<value>classpath:properties</value>

</array>

</property>

</bean>

之后在java代码里面可以用#{propkey}来获取对应的数据prop是bean的名字,key是配置文件的键。

3使用@PropertySource

在springboot中,可以不需要xml文件来设置配置文件,在需要使用配置文件的类名字前加上

@PropertySource(“locations")就可以读取指定位置的配置,在代码中使用@Value注解可以获取这些数据

@Value(value = “${key}”)

4使用@ConfigurationProperties(prefix=“”)

SpringBoot项目有时候会使用applicationyml来存储配置信息,一般情况下这些数据的存储格式是

a:

key1:value1

key2:value2

这种嵌套方式,当然可以多层嵌套

在需要使用配置文件的类上面使用@ConfigurationProperties(prefix=“a”)可以获取a标签下一层所有的配置的键值对。

Object 是所有对象的父类

还有那个0是怎么回事,标示符吗?标示符不能只有数字 错的

beanName应该是一个对象的标示符getPropname()是一个方法

总体就是将一个叫beanName的类的getpropname()的方法返回的值给一个叫0的Object对象

目测应该是得到 beanName的prop名字

一个Properties只能加载一个问题,如果你需要加载多个的话只能多写几个了。

例如:

Properties prop = new Properties();

propload(ConfigUtilclassgetClassLoader()getResourceAsStream("configproperties"));

Properties prop1 = new Properties();

prop1load(ConfigUtilclassgetClassLoader()getResourceAsStream("configproperties1"));

如果不熟悉 javautilProperties类,那么现在告诉您它是用来在一个文件中存储键-值对的,其中键和值是用等号分隔的。(如清单 1 所示)。最近更新的javautilProperties 类现在提供了一种为程序装载和存储设置的更容易的方法: loadFromXML(InputStreamis) 和 storeToXML(OutputStream os, String comment) 方法。

一下是详细的说明,希望能给大家带来帮助。

清单 1 一组属性示例

foo=bar

fu=baz

将清单 1 装载到 Properties 对象中后,您就可以找到两个键( foo 和 fu )和两个值( foo 的 bar 和 fu 的baz )了。这个类支持带 \u 的嵌入 Unicode 字符串,但是这里重要的是每一项内容都当作 String 。

清单2 显示了如何装载属性文件并列出它当前的一组键和值。只需传递这个文件的 InputStream 给 load()方法,就会将每一个键-值对添加到 Properties 实例中。然后用 list() 列出所有属性或者用 getProperty()获取单独的属性。

清单 2 装载属性

import javautil;

import javaio;

public class LoadSample {

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

Properties prop = new Properties();

FileInputStream fis =

new FileInputStream("sampleproperties");

propload(fis);

proplist(Systemout);

Systemoutprintln("\nThe foo property: " +

propgetProperty("foo"));

}

}

运行 LoadSample 程序生成如清单 3 所示的输出。注意 list() 方法的输出中键-值对的顺序与它们在输入文件中的顺序不一样。Properties 类在一个散列表(hashtable,事实上是一个 Hashtable 子类)中储存一组键-值对,所以不能保证顺序。

清单 3 LoadSample 的输出

-- listing properties --

fu=baz

foo=bar

The foo property: bar

XML 属性文件

这里没有什么新内容。 Properties 类总是这样工作的。不过,新的地方是从一个 XML 文件中装载一组属性。它的 DTD 如清单 4 所示。

清单 4 属性 DTD

<xml version="10" encoding="UTF-8">

<!-- DTD for properties -->

<!ELEMENT properties ( comment, entry ) >

<!ATTLIST properties version CDATA #FIXED "10">

<!ELEMENT comment (#PCDATA) >

<!ELEMENT entry (#PCDATA) >

<!ATTLIST entry key CDATA #REQUIRED>

如果不想细读 XML DTD,那么可以告诉您它其实就是说在外围 <properties> 标签中包装的是一个<comment> 标签,后面是任意数量的 <entry> 标签。对每一个 <entry>标签,有一个键属性,输入的内容就是它的值。清单 5 显示了 清单 1中的属性文件的 XML 版本是什么样子的。

清单 5 XML 版本的属性文件

<xml version="10" encoding="UTF-8">

<!DOCTYPE properties SYSTEM " >

package cookie;

import javaioFileInputStream;

import javaioIOException;

import javaioPrintWriter;

import javautilProperties;

import javaxservletServletException;

import javaxservlet>

1DBconst 这个类很明显是读取xml里的数据库配置信息错误不在它

2ClassforName(DBconstCLASSNAME)newInstance();

这段话的意思是根据DBconst类中的CLASSNAME这个字符串加载类,然后创建实例

我们从DBconst类文件里发现CLASSNAME已经从配置文件中获得属性(至于这个属性的值是否为空,我们不晓得)

在加上异常是ClassNotFoundException 该类不存在

总结错误可能有三种:

1CLASSNAME这个字符串所指象的类不存在

2配置文件中ClassName这个属性可能不存在值或者给出的值是错误的

3如果有涉及到数据库的话那么你没有该数据库的驱动包

其他不懂的密我

//Testjava

import javautil;

import javaio;

import javalangreflect;

public class Test {

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

InputStream in = TestclassgetClassLoader()getResourceAsStream("propproperties");

Properties pro = new Properties();

proload(in);

inclose();

String className = progetProperty("class");

Class c = ClassforName(className);

Object o = cnewInstance();

Method m = cgetMethod("run");

minvoke(o);

}

}

//Demojava

public class Demo {

public void run() {

Systemoutprintln("run() method has been invoked");

}

}

//propproperties

class=Demo

Java动态程序设计 反射介绍 使用运行的类的信息使你的程序设计更加灵活反射授予了你的代码访问装载进JVM内的Java类的内部信息的权限 并且允许你编写在程序执行期间与所选择的类的一同工作的代码 而不是在源代码中 这种机制使得反射成为创建灵活的应用程序的强大工具 但是要小心的是 如果使用不恰当 反射会带来很大的副作用 在这篇文章中 软件咨询顾问Dennis Sosnoski 介绍了反射的使用 同时还介绍了一些使用反射所要付出的代价 在这里 你可以找到Java反射API是如何在运行时让你钩入对象的 在第一部分 我向你介绍了Java程序设计的类以及类的装载 那篇文章中描述了很多出现在Java二进制类格式中的信息 现在我来介绍在运行时使用反射API访问和使用这些信息的基础 为了使那些已经了解反射基础的开发人员对这些事情感兴趣 我还会介绍一些反射与直接访问的在性能方面的比较 使用反射与和metadata(描述其它数据的数据)一些工作的Java程序设计是不同的 通过Java语言反射来访问的元数据的特殊类型是在JVM内部的类和对象的描述 反射使你可以在运行时访问各种类信息 它甚至可以你让在运行时读写属性字段 调用所选择的类的方法 反射是一个强大的工具 它让你建立灵活能够在运行时组装的代码 而不需要连接组件间的源代码 反射的一些特征也带来一些问题 在这章中 我将会探究在应用程序中不打算使用反射的原因 以为什么使用它的原因 在你了解到这些利弊之后 你就会在好处大于缺点的时候做出决定 初识class 使用反射的起点总时一个java lang Class类的实例 如果你与一个预先确定的类一同工作 Java语言为直接获得Class类的实例提供了一个简单的快捷方式 例如 Class clas = MyClass class;当你使用这项技术的时候 所有与装载类有关的工作都发生在幕后 如果你需要在运行时从外部的资源中读取类名 使用上面这种方法是不会达到目的的 相反你需要使用类装载器来查找类的信息 方法如下所示 // name is the class name to loadClass clas = null;try {clas = Class forName(name);} catch (ClassNotFoundException ex) {// handle exception case}// use the loaded class如果类已经装载 你将会找到当前在在的类的信息 如果类还没有被装载 那么类装载器将会装载它 并且返回最近创建的类的实例 关于类的反射 Class对象给予你了所有的用于反射访问类的元数据的基本钩子 这些元数据包括有关类的自身信息 例如象类的包和子类 还有这个类所实现的接口 还包括这个类所定义的构造器 属性字段以及方法的详细信息 后面的这些项是我们在程序设计过种经常使用的 因此在这一节的后面我会给出一些用这些信息来工作的例子 对于类的构造中的每一种类型(构造器 属性字段 方法) java lang Class提供了四种独立的反射调用以不的方式来访问类的信息 下面列出了这四种调用的标准形式 它是一组用于查找构造器的调用 Constructor getConstructor(Class[] params)  使用指定的参数类型来获得公共的构造器 Constructor[] getConstructors()获得这个类的所有构造器 Constructor getDeclaredConstructor(Class[] params) 使用指定的参数类型来获得构造器(忽略访问的级别)Constructor[] getDeclaredConstructors() 获得这个类的所有的构造器(忽略访问的级别)上述的每一种方法都返回一或多个java lang reflect Constructor的实例 Constructor类定义了一个需要一个对象数据做为唯一参数的newInstance方法 然后返回一个最近创建的原始类的实例 对象数组是在构造器调用时所使用的参数值 例如 假设你有一个带有一对String 类型做为参数的构造器的TwoString类 代码如下所示 public class TwoString {private String m_s m_s ;public TwoString(String s String s ) {m_s = s ;m_s = s ;}}下面的代码显示如何获得TwoString类的构造器 并使用字符串 a 和 b 来创建一个实例 Class[] types = new Class[] { String class String class };Constructor cons = TwoString class getConstructor(types);Object[] args = new Object[] { a b };TwoString ts = cons newInstance(args);上面的代码忽略了几种可能的被不同的反射方法抛出的异常检查的类型 这些异常在Javadoc API中有详细的描述 因此为简便起见 我会在所有的代码中忽略它们 在我涉及到构造器这个主题时 Java语言也定义了一个特殊的没有参数的(或默认)构造器快捷方法 你能使用它来创建一个类的实例 这个快捷方法象下面的代码这样被嵌入到类的自定义中 Object newInstance() 使用默认的构造器创建新的实例 尽管这种方法只让你使用一个特殊的构造器 但是如果你需要的话 它是非常便利的快捷方式 这项技术在使用JavaBeans工作的时候尤其有用 因为JavaBeans需要定义一个公共的 没有参数的构造器 通过反射来查找属性字段 Class类反射调用访问属性字段信息与那些用于访问构造器的方法类似 在有数组类型的参数的使用属性字段名来替代 使用方法如下所示 Field getField(String name)  获得由name指定的具有public级别的属性字段Field getFields() 获得一个类的所有具有public级别的属性字段Field getDeclaredField(String name) 获得由name指定的被类声明的属性字段Field getDeclaredFields() 获得由类定义的所有的属性字段尽管与构造器的调用很相似 但是在提到属性字段的时候 有一个重要的差别 前两个方法返回能过类来访问的公共(public)属性字段的信息(包括那些来自于超类的属性字段) 后两个方法返回由类直接声明的所有的属性字段(忽略了属性字段的访问类型) Java lang reflect Field的实例通过调用定义好的getXXX和setXXX方法来返回所有的原始的数据类型 就像普通的与对象引用一起工作的get和set方法一样 尽管getXXX方法会自动地处理数据类型转换(例如使用getInt方法来获取一个byte类型的值) 但使用一个适当基于实际的属性字段类型的方法是应该优先考虑的 下面的代码显示了如何使用属性字段的反射方法 通过指定属性字段名 找到一个对象的int类型的属性字段 并给这个属性字段值加 public int incrementField(String name Object obj) throws {Field field = obj getClass() getDeclaredField(name);int value = field getInt(obj) + ;field setInt(obj value);return value;}这个方法开始展现一些使用反射所可能带来的灵活性 它优于与一个特定的类一同工作 incrementField方法把要查找的类信息的对象传递给getClass方法 然后直接在那个类中查找命名的属性字段 通过反射来查找方法 Class反射调用访问方法的信息与访问构造器和字段属性的方法非常相似 Method getMethod(String name Class[] params)  使用指定的参数类型获得由name参数指定的public类型的方法 Mehtod[] getMethods()获得一个类的所有的public类型的方法Mehtod getDeclaredMethod(String name Class[] params)使用指定的参数类型获得由name参数所指定的由这个类声明的方法 Method[] getDeclaredMethods() 获得这个类所声明的所有的方法与属性字段的调用一样 前两个方法返回通过这个类的实例可以访问的public类型的方法包括那些继承于超类的方法 后两个方法返回由这个类直接声明的方法的信息 而不管方法的访问类型 通过调用返回的Java lang reflect Mehtod实例定义了一个invoke方法 你可以使用它来调用定义类的有关实例 这个invoke方法需要两个参数 一个是提供这个方法的类的实例 一个是调用这个方法所需要的参数值的数组 下面给出了比属性字段的例子更加深入的例子 它显示了一个的方法反射的例子 这个方法使用get和set方法来给JavaBean定义的int类型的属性做增量 *** 作 例如 如果对象为一个整数类型count属性定义了getCount和setCount方法 那么为了给这个属性做增量运算 你就可以把 count 做为参数名传递给调用的这个方法中 示例代码如下 public int incrementProperty(String name Object obj) {String prop = Character toUpperCase(name charAt( )) +name substring( );String mname = get + prop;Class[] types = new Class[] {};Method method = obj getClass() getMethod(mname types);Object result = method invoke(obj new Object[ ]);int value = ((Integer)result) intValue() + ;mname = lishixinzhi/Article/program/Java/hx/201311/26154

以上就是关于怎么动态给java注解参数赋值全部的内容,包括:怎么动态给java注解参数赋值、java中Object 0=beanName.getPropname()是什么意思谁用过、java中用Properties类加载配置文件等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9726823.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存