0 0

Java反射机制既然可以拿到class对象,知道其中方法为啥不直接使用对象调用方法?5

Java反射机制既然可以拿到class对象,知道其中方法为啥不直接使用对象调用方法?而要invoke来调用对象的方法?
2014年12月20日 23:27

6个答案 按时间排序 按投票排序

0 0

谁说是不可以的了?拿到对象后可以直接执行方法。你说的这种是方法名也是通过参数传递过来的情况。

2015年3月06日 17:02
0 0

你要是事先已经知道是什么类,当然可以将Class构造一个实例,造型成你的类对象直接调用了。

示意代码例如:


Class c = ....
Object o = c.callConstruct( args );//调用构造方法

MyClass mo = (MyClass)o;

mo.myMethod(...);

2014年12月26日 09:16
0 0

因为这种需求下,方法名是程序运行过程中才得到的,并非你在写代码的时候就能确定的。

2014年12月22日 13:04
0 0

try {
//传入的类名和方法名
String className="demo.Test";
String methodName="saveData";

Class c = Class.forName("");
Method ms[] = c.getDeclaredMethods();

for(Method m:ms){
//遍历找到所需要的方法
if(m.getName().equals(methodName)){
//传入参数,执行方法(参数我就不写了)
m.invoke(obj, args);
}
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


你还是没有理解啊,自己把代码敲一遍就知道了。
既然用到了反射,那就说明这是通用模版,所需要的类,方法名,参数都是未知的,需要传过来的。
你Class a=Class.forName("demo.Test"),就算c.newInstance(),
c也还是Class类,没有变成Test类,所以没法通过c来直接引用Test的方法。
只能根据方法名去获取方法



2014年12月22日 09:37
0 0

举个简单例子,你肯定是用过spring的注入方式吧
比如你想要在PersonService类中注入PersonDao,那么如果按照new的方式,那就是Person.setPersonDao(dao),那么如果多个Servcie的话,是不是意味着你要写一大堆的new方式,那么BeanFacory怎么使用的呢?

	for (Method method : methods) {
				String name = method.getName();
				if (name.length() > 3 && name.startsWith(SET_METHOD)
						&& Modifier.isPublic(method.getModifiers())
						&& !Modifier.isStatic(method.getModifiers())
						&& method.getParameterTypes().length == 1) {
					Class<?> parameterType = method.getParameterTypes()[0];
					if (Map.class.equals(parameterType) && SET_PROPERTIES_METHOD.equals(name)) {
						method.invoke(object, new Object[] { instances });
					} }
这里只是一小段代码,实际上做到了通用,这样不管多少个Servcie只要你前提是set方式,我就帮你织入注入类,当然这里我未描写proxy,加上动态代理,可能说的更为透彻

2014年12月21日 21:19
0 0

Class是对类的抽象(每个类对应一份字节码)。一般情况下,比如A a = new A();直接通过a对象调用方法即可。但是在有些场景下,这样是做不到的,比如类名A是通过参数传递过来的,这时候你就无法通过new的方法创建对象,需要先加载这个类,获取Method对象,然后用Method已反射的形式调用相应的方法。

2014年12月21日 13:27

相关推荐

    java通过反射创建对象并调用方法

    Java 通过反射创建对象并调用方法 Java 通过反射创建对象并调用方法是 Java programming 语言中的一种高级技术,允许开发者在运行时动态地创建对象和调用方法。这种技术广泛应用于 Java 框架和库的开发中,例如 ...

    使用java反射将结果集封装成为对象和对象集合操作

    Java 反射机制是在运行状态中,可以知道任何一个类的属性和方法,并且调用类的属性和方法。反射机制能够做很多事情,例如: * 判断运行对象的所属类 * 构造任意一个类的对象 * 获取任意一个类的属性和方法 * 调用...

    通过反射拿到Context Demo

    反射是Java提供的一种强大的机制,允许程序在运行时检查类、接口、字段和方法的信息,并能动态调用对象的方法或访问其属性。在Android中,我们可以利用反射来获取并操作类的私有成员,包括私有的Context实例。 以下...

    Java通过PropertyDescriptor反射调用set和get方法

    它首先获取对象`obj`的类,然后调用`getPropertyDescriptor()`获取对应的`PropertyDescriptor`,接着从`PropertyDescriptor`中获取`set`方法,最后使用`invoke()`方法调用`set`方法,将`value`值设置到对象的属性上...

    Java笔记-通过反射获取注解及Spring中获取某包下的所有class文件

    3. 一旦你得到了注解对象,就可以调用它的方法来获取注解的属性值。例如,`tableAnnotation.name()`将返回表的名称。 接下来,我们将讨论如何在Spring框架中遍历指定包下的所有类文件。Spring提供了`...

    反射获取Context的实例

    然后,我们可以使用反射来调用`getApplicationContext()`方法,如果对象不直接公开这个方法: ```java try { Class&lt;?&gt; clazz = Class.forName("com.example.MainActivity"); Object instance = clazz.newInstance...

    Java 8新增的方法参数反射实例分析

    Java 8作为重要的版本更新之一,新增了许多特性,其中就包括了对方法参数反射的增强。本篇将从Java 8引入的新特性出发,详细阐述Java 8中新增的方法参数反射功能,并通过实例展示其应用。 首先,我们来看看Java 8...

    java从list中取出对象并获得其属性值的方法

    总结来说,Java的反射机制为我们提供了一种灵活的方式来操作对象,包括从`List`中取出对象并获取其属性值。这种方法使得代码更具通用性和可复用性,特别适合处理各种类型的数据集合。在实际应用中,一定要注意处理...

    基于Java反射技术实现简单IOC容器

    外部想要调用这些对象,那么就使用Map的键,来拿到这个集合中对应的值(对象)。 在IOC容器类中,我们首先需要加载XML文件,然后扫描配置的对象信息。我们可以使用Java的DOM解析XML文件,获取每个对象的信息。然后...

    20200609面试题.docx

    线程池是一种将多个线程对象放到一个容器中的技术,当使用的时候就不用 new 线程而是直接去池中拿线程即可,节省了开辟子线程的时间,提高了代码执行效率。Java 中的线程池可以使用 java.util.concurrent 包中的 ...

    易思博java笔试

    7. **反射机制**:Class类的使用,动态加载类,创建对象,调用方法,访问字段等。 8. **JVM**:Java虚拟机的工作原理,内存模型(堆、栈、方法区),垃圾回收机制等。 9. **设计模式**:常见的设计模式如单例模式...

    在父类获取子类属性

    在`main`方法中,我们可以通过直接访问和调用方法来获取子类的属性。 **标签:“源码”与“工具”:** 在实际开发中,理解源码可以帮助我们更好地掌握类库的工作原理,从而优化代码和解决问题。对于“工具”,可能...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    180多页面试题,前前后后不间断的更新了两年,准备换工作时,总是拿来看看,有比较好的面试题,也不间断的更新,面试题目录如下: 【基础】面向对象的特征有哪些方面 13 抽象 13 继承 13 封装 13 多态性 13 【基础】...

    一份超级详细的Java面试题【大厂面试真题+Java学习指南+工作总结】

    Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据主导地位。为了在Java面试中脱颖而出,了解并掌握核心的Java知识点至关重要。这份“Java面试题”...祝你在面试中取得好成绩,顺利拿到理想的offer!

    spring源码剖析

    当应用程序需要某个bean时,只需通过bean ID就可以从Map中获取,这就是描述中提到的“从map中拿到的对象”。 接下来,我们查看源码中关于Bean Factory的实现。Spring的核心实现是`DefaultListableBeanFactory`,它...

    去年秋招整理了这份后端开发的核心面试题(偏Java),顺利拿到了腾讯offer,决定把它贡献出来

    - 反射:通过 `Class` 类获取运行时类信息,创建对象,调用方法等。 - 泛型:限制参数类型,增强类型安全,`extends` 表示上限边界,`super` 表示下限边界。 - 多态:同一方法根据对象的实际类型表现出不同行为,...

    Android开发获取手机Mac地址适配所有Android版本

    对于Android 6.0以下的版本(API级别22及更低),我们可以直接使用Google提供的公共方法来获取Mac地址,即通过`WifiManager`的`getConnectionInfo()`方法获取`WifiInfo`对象,然后调用`getMacAddress()`获取Mac地址...

Global site tag (gtag.js) - Google Analytics