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 ...
随机推荐
- NET Core 数据保护2
ASP.NET Core 数据保护(Data Protection 集群场景)[下] 前言 接[中篇],在有一些场景下,我们需要对 ASP.NET Core 的加密方法进行扩展,来适应我们的需求, ...
- Linux——搭建PHP开发环境第一步:apache
原文链接:http://www.2cto.com/os/201511/450258.html ##### Apache 编译安装[root@localhost ~]# yum install gcc ...
- angular2 学习笔记 ( Component 组件)
refer : https://angular.cn/docs/ts/latest/guide/template-syntax.html https://angular.cn/docs/ts/late ...
- 那些SQL语句
根据book_id,class_id确定老师uid select user_id from lessons left join book on lessons.lesson_id = book.les ...
- -_-#【Mac】快捷操作
快捷键 command + 拖拽 = 剪切option + 拖拽 = 复制command + option + 拖拽 = 快捷方式 command + ] 前进command + [ 后退 comma ...
- [GDKOI2016]小学生数学题
记 $F(n)=\sum\limits_{i=1}^{n}i^{-1}$ $G(n)=\sum\limits_{i=1,i\neq jp}^{n}i^{-1}$ 我们要算$F(n)\%p^k$ 那么 ...
- HDU 5568 - BestCoder Round #63 - sequence2
题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=5568 题意 : 给一个长度已知的序列, 给一个值k, 问该序列中有多少种长度为k的上升子序列 思路 ...
- C++ STL之string常用指令
string,大小可变的字符串,有些类似于C中的字符数组. 只记载本人在ACM中常用的函数,并且全部经过程序测试. 1.初始化 string s1;——默认构造函数s1为空串 string s2(s1 ...
- jquery and js 判断一个元素是否存在
一.javascript中判断一个元素是否存在 if(document.getElementById('example')){ // do sth } 二.jquery中判断一个元素是否存在 < ...
- C#时间戳的获取与转换方法
/// <summary> /// 获取当前时间戳 /// </summary> /// <param name="bflag"></pa ...