通过反射获得对象的方法

准备工作:

有一个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. java的类加载机制

    1.概述 Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允许用户借由这个Class ...

  2. Mifare 0简介

    Mifare UltraLight又称为MF0,从UltraLight(超轻的)这个名字就可以看出来,它是一个低成本.小容量的卡片.低成本,是指它是目前市场中价格最低的遵守ISO14443A协议的芯片 ...

  3. 令用EclipseJ2EE创建的Dynamic Web project目录结构与用MyEclipse创建的Web project一样

    Eclipse for EE 版本, 创建 Dynamic Web Project  会有俩个工程. 其中一个 是你创建的工程, 另外一个 是Servers 工程(其实也就是tomcat 的一个配置) ...

  4. 【HDOJ】2424 Gary's Calculator

    大数乘法加法,直接java A了. import java.util.Scanner; import java.math.BigInteger; public class Main { public ...

  5. TRAFFIC LIGHTS POJ 1158

    题目大意: 在Dingilville 城市安排是一种不同寻常的方式,每个交叉路口有一条道路连接,一条道路最多连接两个不同的交叉路口.每个交叉路口不能连接他自己.道路旅行一端到另一端的时间是相同的,任何 ...

  6. (转载)php中实现定时执行计划任务方法

    (转载)http://www.111cn.net/phper/php/41216.htm PHP脚本执行时间限制,默认的是30m 解决办法:set_time_limit();或者修改PHP.ini 设 ...

  7. HDOJ(HDU) 1977 Consecutive sum II(推导、、)

    Problem Description Consecutive sum come again. Are you ready? Go ~~ 1 = 0 + 1 2+3+4 = 1 + 8 5+6+7+8 ...

  8. [Java] 垃圾回收 ( Garbage Collection ) 的步骤演示

    关于 JVM 垃圾回收机制的基础内容,可参考上一篇博客 垃圾回收机制 ( Garbage Collection ) 简介 上一篇博客,介绍了堆的内存被分为三个部分:年轻代.老年代.永生代.这篇博文将演 ...

  9. java在windows下加载dll

    java在类中加载动态链接库文件. 类文件中: static { System.loadLibrary("dll文件"); } dll文件在工程的包路径下.例如:pro/bin/h ...

  10. Oracle 数据库 Database Express Edition 11g Release 2 (11.2) 错误解决集锦(安装方面)

    前言:第一次接触数据库,想下载个oracle试玩下(虽然听说一般大企业才用),到 官网下载 了个简易版 XE 版本,安装时要注意记住自己输入的数据库密码(口令)  还有安装路径不能含有空格(Do no ...