通过反射获得对象的方法

准备工作:

有一个User类如下

 package o1;

 /**
* Created by yesiming on 16-11-19.
*/
public class User {
private int id;
private String name // 无参构造方法
public User() {
System.out.println("new Instance() 1");
}
// 有参构造方法
public User(int id, String name) {
System.out.println(id + ":" + name + ":new Instance() 2");
}
// get set 省略
}

下面写得到User对象的几种方法:

 package o1;

 import org.junit.Test;

 import java.io.File;
import java.lang.reflect.*;
import java.lang.reflect.InvocationTargetException;
import java.net.URI;
import java.net.URL; /**
* Created by yesiming on 16-11-19.
*/
public class MainTest { @Test
public void getClazz() {
Class clazz = User.class; // 得到User的类描述
System.out.println(clazz.toString());
} @Test
public void getClazz1() {
Class clazz = User.class;
try {
Object obj = clazz.newInstance(); // 通过类描述的newInstance()方法可以得到该类的对象(内部会调用无参构造方法)
System.out.println(obj.toString());
} catch (Exception e) { } finally {
}
} @Test
public void getClazz2() {
Class clazz = User.class;
try {
// 通过类描述的getDeclaredConstructor(Class... clazz)方法得到对应的构造函数
Constructor constructor = clazz.getDeclaredConstructor(int.class, String.class);
// 通过对应的构造函数的newInstance(xxx, xxx)方法得到类对象
Object obj = constructor.newInstance(1, "iming"); // 通过
System.out.println(obj.toString());
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
} /**
* 通过getMethod(String methodName)得到方法描述符
* 通过方法描述符的invode(类描述符 xxx )方法,执行该方法
*/
@Test
public void getMethod() throws Exception {
Class clazz = User.class;
Constructor constructor = clazz.getDeclaredConstructor(int.class, String.class);
Object obj = constructor.newInstance(1, "yesiming");
Method m = clazz.getMethod("setName", String.class);
m.invoke(obj, "Haha"); Method m2 = clazz.getMethod("getName");
Object obj1 = m2.invoke(obj);
System.out.println(obj1.toString());
} /**
* 得到指定包名下所有的类
*/
@Test
public void getClasses() throws Exception {
Class clazz = User.class;
ClassLoader loader = clazz.getClassLoader();
// 1. 通过classloader载入包路径,得到url
URL url = loader.getResource("o1/o1_a");
URI uri = url.toURI();
// 2. 通过File获得uri下的所有文件
File file = new File(uri);
File[] files = file.listFiles();
for (File f : files) {
String fName = f.getName();
if (!fName.endsWith(".class")) {
continue;
}
fName = fName.substring(0, fName.length() - 6);
String perfix = "o1.o1_a.";
String allName = perfix + fName;
// 3. 通过反射加载类
clazz = Class.forName(allName);
System.out.println(clazz);
}
} }

Java反射 - 1(得到类对象的几种方法,调用方法,得到包下的所有类)的更多相关文章

  1. Java反射机制(获取Class对象的三种方式+获取Class中的构造函数进行对象的初始化+获取反射类的字段+获取反射类的一般方法)

    反射技术其实就是动态加载一个指定的类,并获取该类中的所有内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员,简单来说:反射技术可以对一个类进行解剖,反射大大增强 ...

  2. Java反射机制(创建Class对象的三种方式)

    1:SUN提供的反射机制的类: java.lang.Class<T> java.lang.reflect.Constructor<T> java.lang.reflect.Fi ...

  3. java反射之获取枚举对象

    项目中导入大量枚举对象,用来定义常量.随着带来一个问题,就是每个枚举类都需要通过key来获取对应枚举的需求. public enum ExamType { CRAFT(1, "草稿" ...

  4. java.util.regex包下的Pattern类和Matcher类的使用总结

    一.介绍 Java正则表达式通过java.util.regex包下的Pattern类与Matcher类实现1.Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不 ...

  5. (转载)Java中如何遍历Map对象的4种方法

    在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...

  6. Java 获取指定包下的所有类

    package com.s.rest.util; import java.io.File; import java.io.FileFilter; import java.io.IOException; ...

  7. Android系统,动态找出一个包下所有的类

    最近在写一个android应用,由于针对不同机型功能很不同,为了隔离变化,希望将各项功能插件化,通过编译开关来控制不同版本的功能,而不是在代码中通过逻辑来判断. 我想了一个办法,用表驱动的方法,结合插 ...

  8. js中使用function定义类、实例化,函数的调用方法

    function Test002(name, age){ name, age, this.printInfo = function(){ //定义的公有方法 console.log(name, age ...

  9. Java反射获取类对象的三种方式

    package demo01; /* * 获取一个类的class文件对象的三种方式 * 1.对象获取 * 2.类名获取 * 3.Class类的静态方法获取 */ public class Reflec ...

随机推荐

  1. 查询一周最近一周的数据,date String 随意转换,更有疯狂的排序

    --查看一周随访的详情70007PROCEDURE GET_PATIENT_WEEKFU ( userId in NUMERIC, time in date, V_LIST OUT MYCURSOR ...

  2. JavaEmail

    一.邮件相关基本概念   a)邮件服务器:某厂商提供的电子邮件服务器的集群(或群集)   b)电子邮箱:邮件服务器上提供的个人或企业的邮件空间   c)邮件传输协议:邮件服务器之间,和个人或企业与邮件 ...

  3. pojPots

    http://poj.org/problem?id=3414 #include<cstdio> #include<cstring> #define MAXN 1000000 u ...

  4. KeilMDK4.7a下载地址/中文乱码解决/自动关联设置

    推荐地址1,速度更快(确定为4.7a版本,且含注册机):1.http://www.mcuzone.com/software/keil/MDK470.RAR 2.http://kuai.xunlei.c ...

  5. Keil C51库函数原型列表

    //1. CTYPE.H bit isalnum(char c): bit isalpha(char c): bit iscntrl(char c): bit isdigit(char c): bit ...

  6. BZOJ 1013 [JSOI2008]球形空间产生器sphere

    1013: [JSOI2008]球形空间产生器sphere Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3074  Solved: 1614[Subm ...

  7. Eclipse无法设置NDK路径的解决方法

    如果在Eclipse中设置NDK路径的时候遇到下面的情况(尼玛,我的NDK设置呢?): 可以参考百度经验解决:http://jingyan.baidu.com/article/4d58d5413000 ...

  8. 关于jsp中超链接的相对路径

    前提:新建了一个名为MyProject的web工程.在WebContent目录下新建一个jsp目录,在jsp目录中新建一个index.jsp文件. 实验:在index.jsp里写了4个链接,如下: & ...

  9. 寻找INTERIGHT衬衫男神! [复制链接]

    寻找INTERIGHT衬衫男神! - 公告板 - 京东内部论坛 - Powered by Discuz! 寻找INTERIGHT衬衫男神!   [复制链接]

  10. E - QS Network - zoj 1586(简单)

    题意:在一个叫做QS的星系,他们使用一些特殊的通讯方式,两个人之间通讯需要使用一个网络适配器,但是一个网络适配器只能跟一个人联系,所有它连接几个人就需要及格适配器,而且每个人都有一些不同的偏好,喜欢的 ...