如:String str="HelloWorld".
java.lang. Class strClass=str.getClass()
或者(类名.class)//得到类对象。
或者通过加载器加载
Class className = Class.forName("java.lang.String");
得到类对象(类别)后可以有如下方法
getName() 以字符串返回类对象名称
(2)、按需加载方法forName()或ClassLoader类的loadClass()方法
java.lang.Class bookClass=java.lang.Class.forName("Book"); //Book为一个类
或者 java.lang.Class bookClass=ClassLoader.loadClass("Book")。
补充:Class类的信息是在编译的时候就被加入到.class档案中的,执行期间JVM会检查对应的Class对象是否已经加载,如果没有加载,则会寻找对应的.class档案载入。
(3)、反射机制
定义:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;
这种动态获取的信息以 及动态调用对象的方法的功能称为java语言的反射机制。注意:动态两字。
由对象得到类别: java.lang.Class aClass=obj.getClass();
由类别得到对象属性,(静态和动态的) Field field=aClass.getField(fieldName);
由属性得到该属性的对象 Object obj=field.get(obj);
由类别得到某个方法
public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {
Object[] args:方法需要的参数数组
Class ownerClass = aClass.getClass();
Class[] argsClass = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}
//得到这个方法
Method method = ownerClass.getMethod(methodName, argsClass);
//执行这个方法 返回值是Object,也既是该方法的返回值。
return method.invoke(owner, args);(4) 反射应用:
动态调用对象的方法
// 实体类
public class ReflectionDemo { public void method1(String str) {
System.out.println("method1()==>" + "String==>" + str);
} public void method2(String str, int n) {
System.out.println("method2()==>" + "String==>" + str + "int==>"
+ n);
} public void method3(String str, int n, char ch) {
System.out.println("method3()==>" + "String==>" + str + "int==>"
+ n + "char==>" + ch);
} public String method4(String str, double n) {
return str + n;
}
}
public class ReflectionDemo {
public void method1(String str){
System.out.println("method1()==>"+"String==>"+str);
}
public void method2(String str,int n){
System.out.println("method2()==>"+"String==>"+str+"int==>"+n);
}
public void method3(String str,int n,char ch){
System.out.println("method3()==>"+"String==>"+str+"int==>"+n+"char==>"+ch);
}
public String method4(String str,double n){
return str+n;
}
}
public class InvokeDemo {
//定义方法对象
private Method method = null;
//定义方法返回值
private Object result = null;
private Map hashMap = new HashMap();
//把方法名和对于的参数类型数组封装在hashMap里
public void initMap(Object obj){
Class className = obj.getClass();
Method []methos = className.getMethods();
for (int i = 0; i<methos.length; i++){
String name = methos[i].getName();
Class []args = methos[i].getParameterTypes();
hashMap.put(name, args);
}
}
/**
*
* @param obj 执行该方法的具体对象
* @param methodName 执行的具体对象
* @param args执行该方法的具体参数
* @return
* @throws InvocationTargetException
* @throws IllegalAccessException
* @throws IllegalArgumentException
* @throws NoSuchMethodException
* @throws SecurityException
*/
public Object getResultByMethod(Object obj,String methodName,Object[] args){
Class className = obj.getClass();
try {
method = className.getMethod(methodName, (Class[]) hashMap.get(methodName));
result = method.invoke(obj,args);
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return result;
}
//测试
public static void main(String []args){
InvokeDemo ind = new InvokeDemo();
ReflectionDemo ref = new ReflectionDemo();
ind.initMap(ref);
List<String> list = new ArrayList<String>();
for (int i = 1; i<=4;i++){
list.add("method"+i);
}
//第一个方法形参数
Object []realArgs1 = new Object[1];
realArgs1[0] = "HelloWorld";
//第二个方法形参数
Object []realArgs2 = new Object[2];
realArgs2[0] = "HelloWorld";
realArgs2[1] = 12;
//第三个方法形参数
Object []realArgs3 = new Object[3];
realArgs3[0] = "HelloWorld";
realArgs3[1] = 14;
realArgs3[2] = 'c';
//第四个方法形参数
Object []realArgs4 = new Object[2];
realArgs4[0] = "HelloWorld";
realArgs4[1] = 23;
Object result = null;
//调用方法method1
result = ind.getResultByMethod(ref, list.get(0), realArgs1);
//调用方法method2
result = ind.getResultByMethod(ref, list.get(1), realArgs2);
//调用方法method3
result = ind.getResultByMethod(ref, list.get(2), realArgs3);
//调用方法method4
result = ind.getResultByMethod(ref, list.get(3), realArgs4);
if (result != null) {
System.out.println("result:"+result);
}
}
}
类加载器及反射机制(一)-基础
原创wx63086371c7e9c 博主文章分类:JSE ©著作权
©著作权归作者所有:来自51CTO博客作者wx63086371c7e9c的原创作品,请联系作者获取转载授权,否则将追究法律责任
上一篇:Java SE 7 新特性
下一篇:软件设计的基本原则
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
类加载机制及反射
==
类加载机制及反射 -
类加载器及反射机制(三)-ClassLoader
(1)、java.lang.Class 概念:Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行
classloader string class 加密 date -
[JVM]类加载机制及反射
一、Java类加载机制1.概述 Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息
jvm 初始化 java 类加载器 -
【Java基础增强】类加载器和反射
类加载器负责将.class文件(存储的物理文件)加载在到内存中 反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意属性和方法;
java python 开发语言 System 构造方法 -
类加载器及反射简单笔记
类加载器及反射简单笔记
jvm java 开发语言 后端 数据结构 -
【Java】01基础-18类加载器和反射
【Java】01基础-18类加载器和反射
java 构造方法 类加载器 加载 -
数据库Boolean类型的字段需不需要索引
 
数据库 dataset filter insert delete -
spark官网查看版本对应关系
Spark Streaming使用 (scala版本)<!--运行依赖--> <dependencies> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.
spark官网查看版本对应关系 spark spark streaming kafka apache