Java反射 - 1(得到类对象的几种方法,调用方法,得到包下的所有类)
通过反射获得对象的方法
准备工作:
有一个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(得到类对象的几种方法,调用方法,得到包下的所有类)的更多相关文章
- Java反射机制(获取Class对象的三种方式+获取Class中的构造函数进行对象的初始化+获取反射类的字段+获取反射类的一般方法)
反射技术其实就是动态加载一个指定的类,并获取该类中的所有内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员,简单来说:反射技术可以对一个类进行解剖,反射大大增强 ...
- Java反射机制(创建Class对象的三种方式)
1:SUN提供的反射机制的类: java.lang.Class<T> java.lang.reflect.Constructor<T> java.lang.reflect.Fi ...
- java反射之获取枚举对象
项目中导入大量枚举对象,用来定义常量.随着带来一个问题,就是每个枚举类都需要通过key来获取对应枚举的需求. public enum ExamType { CRAFT(1, "草稿" ...
- java.util.regex包下的Pattern类和Matcher类的使用总结
一.介绍 Java正则表达式通过java.util.regex包下的Pattern类与Matcher类实现1.Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不 ...
- (转载)Java中如何遍历Map对象的4种方法
在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...
- Java 获取指定包下的所有类
package com.s.rest.util; import java.io.File; import java.io.FileFilter; import java.io.IOException; ...
- Android系统,动态找出一个包下所有的类
最近在写一个android应用,由于针对不同机型功能很不同,为了隔离变化,希望将各项功能插件化,通过编译开关来控制不同版本的功能,而不是在代码中通过逻辑来判断. 我想了一个办法,用表驱动的方法,结合插 ...
- js中使用function定义类、实例化,函数的调用方法
function Test002(name, age){ name, age, this.printInfo = function(){ //定义的公有方法 console.log(name, age ...
- Java反射获取类对象的三种方式
package demo01; /* * 获取一个类的class文件对象的三种方式 * 1.对象获取 * 2.类名获取 * 3.Class类的静态方法获取 */ public class Reflec ...
随机推荐
- Xcode7调试-b
Xcode7中苹果为我们增加了两个重要的debug相关功能.了解之后觉得非常实用,介绍给大家. 1.Address Sanitizer: 妈妈再也不用担心 EXC_BAD_ACCESS? EXC_BA ...
- 【转载51CTO】Linux中引号那些事儿
原文链接:http://os.51cto.com/art/201207/348855.htm 我们将把编写脚本的事情暂时搁在一边,然后来讨论一些,我们一直在用的,但是没有解释的东西.引号在这一节里面, ...
- PL/SQL 动态SQL
declare msql varchar2(200); row_id varchar2(200); begin loop row_id := 'AAATGiAAEAAAuLLAAA'; msql := ...
- POJ3083 Children of the Candy Corn(搜索)
题目链接. 题意: 先沿着左边的墙从 S 一直走,求到达 E 的步数. 再沿着右边的墙从 S 一直走,求到达 E 的步数. 最后求最短路. 分析: 最短路好办,关键是沿着墙走不太好想. 但只要弄懂如何 ...
- 最大流Dinic
不断用BFS构造分层网络,用DFS增广.中途用取指的cur优化DFS. Dinic封装模板: #include <cstdio> #include <iostream> #in ...
- cholesky分解
接着LU分解继续往下,就会发展出很多相关但是并不完全一样的矩阵分解,最后对于对称正定矩阵,我们则可以给出非常有用的cholesky分解.这些分解的来源就在于矩阵本身存在的特殊的 结构.对于矩阵 ...
- centOS 6.4挂载centOS分区
今天想用centOS打开在windows下编辑的emacs笔记,发现好像不可以自动挂载nfts分区,搜了一下,发现一大坨,还是发个文来标记下好: 首先,安装rpmforge软件库的源 命令行下输入下面 ...
- Java中Websocket使用实例解读
介绍 现在很多网站为了实现即时通讯,所用的技术都是轮询(polling).轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给客服端的浏览器 ...
- G - Oil Skimming - hdu 4185(二分图匹配)
题意:在大海里有一些石油 ‘#’表示石油, ‘.’表示水,有个人有一个工具可以回收这些石油,不过只能回收1*2大小的石油块,里面不能含有海水,要不就没办法使用了,求出来最多能回收多少块石油 分析:先把 ...
- 如何将HashMap,按照value值排序
这里要用到一个Comparator的接口,里面只有一个方法,compare(),我们实现这个接口就好,很简单 private class ValueComparator implements Comp ...