java反射实例(java如何用反射获取类实例)

本文目录
java如何用反射获取类实例
class类有newInstance() 这个方法就可以用来生成实例。
用反射获取类spring用的很多,李刚的书里面就用。不用spring的可以直接用java的jdk中的,网上实例很多,搜索“java 反射实例”一下就可以。
关于用java反射调用一个类里面的方法并执行
Java中要用到反射,首先就必须要获取到对应的class对象,在Java中有三种方法获取类对应的class对象。
1、通过类的.class属性
2、通过类实例的getClass()方法获取
3、通过Class.forName(String className)方法获取
现在比如在package下有个类Calculator
public class Calculator{
public double add(double score1,double score2){
return score1 + score2;
}
public void print(){
System.out.println("OK");
}
public static double mul(double score1,double score2){
return score1 * score2;
}
}
public class CalculatorTest {
public static void main(String args) throws Exception {
//通过类的.class属性获取
Class《Calculator》 clz = Calculator.class;
//或者通过类的完整路径获取,这个方法由于不能确定传入的路径是否正确,这个方法会抛ClassNotFoundException
//Class《Calculator》 clz = Class.forName("test.Calculator");
//或者new一个实例,然后通过实例的getClass()方法获取
//Calculator s = new Calculator();
//Class《Calculator》 clz = s.getClass();
//1. 获取类中带有方法签名的mul方法,getMethod第一个参数为方法名,第二个参数为mul的参数类型数组
Method method = clz.getMethod("mul", new Class{double.class,double.class});
//invoke 方法的第一个参数是被调用的对象,这里是静态方法故为null,第二个参数为给将被调用的方法传入的参数
Object result = method.invoke(null, new Object{2.0,2.5});
//如果方法mul是私有的private方法,按照上面的方法去调用则会产生异常NoSuchMethodException,这时必须改变其访问属性
//method.setAccessible(true);//私有的方法通过发射可以修改其访问权限
System.out.println(result);//结果为5.0
//2. 获取类中的非静态方法
Method method_2 = clz.getMethod("add", new Class{double.class,double.class});
//这是实例方法必须在一个对象上执行
Object result_2 = method_2.invoke(new Calculator(), new Object{2.0,2.5});
System.out.println(result_2);//4.5
//3. 获取没有方法签名的方法print
Method method_3 = clz.getMethod("print", new Class{});
Object result_3 = method_3.invoke(new Calculator(), null);//result_3为null,该方法不返回结果
}
}
java中,为什么说反射是动态的生成实例动态的调用
反射么 就是根据你的类来为你创建对象
动态就是灵活的,直接写好的不能变的就是静态的
反射一般配合泛型使用
Class.forName(className).newInstance()
你传入什么类 就能对应生成这个类的对象
.Java 反射机制及项目中用到哪些
Java 反射机制运用实例
\\ TIP:只知道类名,要运用反射机制动态调用已知类名的方法
类结构:
-------form(package):CityQueryForm.java
-------test(package):Test.java
CityQueryForm.java:
package form;
import java.util.Hashtable;
public class CityQueryForm {
private String name = null;
public void setName(Hashtable ht)
{
this.name = (String) ht.get("name");
}
public String getName() {
return name;
}
}
Test.java:
package test;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Hashtable;
public class Test {
private void getForm(Hashtable ht, String formName) throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException {
//Class c = Class.forName(formName);
Object o = Class.forName(formName).newInstance(); // 指定类名的类对象
Class partypes;
partypes = Hashtable.class; //setName方法需要的参数
Method ms = o.getClass().getMethod("setName", partypes); //得到指定方法名和参数的方法对象
Method mg = o.getClass().getMethod("getName", null);
ms.invoke(o, ht); //方法调用
String mg.invoke(o, null);
System.out.println(name);
}
public static void main(String args) throws ClassNotFoundException, SecurityException, IllegalArgumentException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
String formName = "form.CityQueryForm";
Hashtable ht = new Hashtable();
ht.put("name", "wuhan");
Test t = new Test();
t.getForm(ht,formName);
}
}
测试结果:
wuhan
java中反射的三种方法是
第一种:通过forName()方法;
第二种:类.class;
第三种:对象.getClass()。
举例如下:
package
test;
public class Demo{
public static void
main(){
Class《?》 c1 = null;
Class《?》 c2 =
null;
Class《?》 c3 =
null;
//三种反射用实例化方式
try{
//最常用的一种形式
c1 =
Class.forName("test.X");
}catch(ClassNotFoundException
e){
e.printStackTrace();
}
//通过Object类中的方法实例化
c2
= new X().getClass();
//通过类.class实例化
c3 =
X.class;
System.out.println("类名:" + c1.getName());
//得到类名
System.out.println("类名:" + c2.getName());
//得到类名
System.out.println("类名:" + c3.getName());
//得到类名
}
}

更多文章:
unix时间戳字段异常值怎么处理(怎么对统计数据的异常值进行判断和处理)
2026年5月15日 06:00
java视频教程马士兵(哪里可以下载全部马士兵JAVA视频教程)
2026年4月6日 02:00
程序员最喜欢的编辑器颜色(我终于知道为什么很多程序员编辑器都用暗色背景了)
2026年7月12日 13:00
必会失去随机存取功能(计算机储存中断电后其中信息会丢失的是什么)
2026年5月16日 20:15
unicode字符转换(Unicode 与 UTF-8 之间的转换)
2025年9月26日 12:00
stack英语(叠什么意思近义词和反义词是什么英文翻译是什么)
2025年7月31日 18:00
没有建站经验怎样创建一个属于自己网站?网站建设的前期准备,建站前须知的几点准备事项
2026年8月18日 03:45
floating tobu(求初音easy dance的歌词啊~~~~~)
2025年7月30日 15:00
减肥为什么不用lose weight(put on 、 put off、 put up、 put down、哪个有 减肥 的意思)
2026年7月27日 16:15













