getInterfaces(),getMethod(String name, Class... parameterTypes),getClass

2024-06-07 06:32

本文主要是介绍getInterfaces(),getMethod(String name, Class... parameterTypes),getClass,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。name 参数是一个String,用于指定所需方法的简称。parameterTypes 参数是按声明顺序标识该方法形式参数类型的 Class 对象的一个数组。如果 parameterTypesnull,则按空数组处理。 


例:以项目Spring_Test为例

beans.xml

<beans><bean id = "u" class = "com.test.dao.impl.UserDAOImpl" /><bean id = "userService" class="com.test.service.UserService" ><property name="userDAO" bean="u"/> </bean>  
</beans>


UserService.java

import com.test.dao.UserDAO;
import com.test.model.User;public class UserService {private UserDAO userDAO;  public void add(User user) {userDAO.save(user);}public UserDAO getUserDAO() {return userDAO;}public void setUserDAO(UserDAO userDAO) {this.userDAO = userDAO;}
}

ClassPathXmlApplicationContext.java

package com.test.spring;import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;public class ClassPathXmlApplicationContext implements BeanFactory {private Map<String , Object> beans = new HashMap<String, Object>();//IOC Inverse of Control DI Dependency Injectionpublic ClassPathXmlApplicationContext() throws Exception {SAXBuilder sb=new SAXBuilder();Document doc=sb.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml")); //构造文档对象Element root=doc.getRootElement(); //获取根元素HDList list=root.getChildren("bean");//取名字为disk的所有元素for(int i=0;i<list.size();i++){Element element=(Element)list.get(i);String id=element.getAttributeValue("id");String clazz=element.getAttributeValue("class");//forName()使用给定的类加载器,返回与带有给定字符串名的类或接口相关联的 Class 对象	       //newInstance()用于创建此 Class 对象所表示的类的一个新实例Object o = Class.forName(clazz).newInstance();//具有指定名的类的 Class 对象。System.out.println(id);System.out.println(clazz);beans.put(id, o);for(Element propertyElement : (List<Element>)element.getChildren("property")) {String name = propertyElement.getAttributeValue("name"); //userDAOString bean = propertyElement.getAttributeValue("bean"); //uObject beanObject = beans.get(bean);//UserDAOImpl instance// "set" + "U" + "serDAO" String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);System.out.println("name.substring(0, 1)的值为: "+name.substring(0, 1));System.out.println("name.substring(1)的值为: "+name.substring(1));System.out.println("method name = " + methodName);//getClass()返回一个对象的运行时类。Method m = o.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]);//使用使用后一个参数在 前一个参数上指派该对象所表示方法的结果 m.invoke(o, beanObject);}}  }public Object getBean(String id) {return beans.get(id);}
}

     //getClass()返回一个对象的运行时类。
     Method m = o.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]);                                                                                      //使用后一个参数在 前一个参数上指派该对象所表示方法的结果 
     m.invoke(o, beanObject);

o为UserService实例的一个对象  

beanObject为UserDAOImpl类型的对象


Method getMethod(String name, Class<?>... parameterTypes)  
--返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。  

方法后面接收的就是Class类的对象,而如:String.class、int.class这些字节码才是Class类的对象
 

getInterfaces

public Class[] getInterfaces()
确定此对象所表示的类或接口实现的接口。

如果此对象表示一个类,则返回值是一个数组,它包含了表示该类所实现的所有接口的对象。数组中接口对象的顺序与此对象所表示的类的声明的 implements 子句中的接口名顺序一致。例如,给定声明:

 class Shimmer implements FloorWax, DessertTopping { ... }
s 的值为 Shimmer 的一个实例;表达式:
 s.getClass().getInterfaces()[0]
的值为表示 FloorWax 接口的 Class 对象;
 s.getClass().getInterfaces()[1]
的值为表示 DessertTopping 接口的 Class 对象。

如果此对象表示一个接口,则该数组包含表示该接口扩展的所有接口的对象。数组中接口对象的顺序与此对象所表示的接口的声明的 extends 子句中的接口名顺序一致。

如果此对象表示一个不实现任何接口的类或接口,则此方法返回一个长度为 0 的数组。

如果此对象表示一个基本类型或 void,则此方法返回一个长度为 0 的数组。

返回:
该类所实现的接口的一个数组。


按照我的理解简单来说,

//getClass()返回一个对象的运行时类。
 Method m = o.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]);
//使用使用后一个参数在 前一个参数上指派该对象所表示方法的结果 
m.invoke(o, beanObject);

就是调用UserService的setUserDAO方法!!!!!

这篇关于getInterfaces(),getMethod(String name, Class... parameterTypes),getClass的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1038408

相关文章

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

如何解决mysql出现Incorrect string value for column ‘表项‘ at row 1错误问题

《如何解决mysql出现Incorrectstringvalueforcolumn‘表项‘atrow1错误问题》:本文主要介绍如何解决mysql出现Incorrectstringv... 目录mysql出现Incorrect string value for column ‘表项‘ at row 1错误报错

java String.join()的使用小结

《javaString.join()的使用小结》String.join()是Java8引入的一个实用方法,用于将多个字符串按照指定分隔符连接成一个字符串,本文主要介绍了javaString.join... 目录1. 方法定义2. 基本用法2.1 拼接多个字符串2.2 拼接集合中的字符串3. 使用场景和示例3

C# string转unicode字符的实现

《C#string转unicode字符的实现》本文主要介绍了C#string转unicode字符的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录1. 获取字符串中每个字符的 Unicode 值示例代码:输出:2. 将 Unicode 值格式化

前端 CSS 动态设置样式::class、:style 等技巧(推荐)

《前端CSS动态设置样式::class、:style等技巧(推荐)》:本文主要介绍了Vue.js中动态绑定类名和内联样式的两种方法:对象语法和数组语法,通过对象语法,可以根据条件动态切换类名或样式;通过数组语法,可以同时绑定多个类名或样式,此外,还可以结合计算属性来生成复杂的类名或样式对象,详细内容请阅读本文,希望能对你有所帮助...

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

IDEA如何将String类型转json格式

《IDEA如何将String类型转json格式》在Java中,字符串字面量中的转义字符会被自动转换,但通过网络获取的字符串可能不会自动转换,为了解决IDEA无法识别JSON字符串的问题,可以在本地对字... 目录问题描述问题原因解决方案总结问题描述最近做项目需要使用Ai生成json,可生成String类型

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情