Java反射机制--笔记
1、认识Class类
任何一个类都是Class类的实例对象,这个实例对象有三种表示方式。
/*java 反射机制*/
// 获取类的方法
UserDao userDao = new UserDao();
Class c = UserDao.class; // 1、知道类名 使用.class获取类
Class d = userDao.getClass(); // 2、知道对象 使用.getClass()获取类
Class m = null; // 3、知道类 使用class.forName("")获取类
try {
m = Class.forName("com.description.dao.UserDao");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} System.out.println("c d是否相等 : " + (c==d));
System.out.println("c m是否相等 : " + (c==m)); try {
UserDao ud = (UserDao) c.newInstance(); // 通过反射实例化一个对象,前提是UserDao必须有一个默认的无参构造方法
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
2、动态加载类实例
新建四个类,一个Software接口,另外新建两个类继承该接口。
Software.java
package com.hua.reflect; /**
* Created by 华天 on 2016/06/06.
*/
public interface Software {
public void show();
}
Word.java
package com.hua.reflect; /**
* Created by 华天 on 2016/06/06.
*/
public class Word implements Software{ @Override
public void show() {
System.out.println("实现wold功能");
}
}
Excel.java
package com.hua.reflect; /**
* Created by HuaTian on 2016/06/06.
*/
public class Excle implements Software {
@Override
public void show() {
System.out.println("实现Excel功能");
}
}
JavaReflect.java
/**
* 动态加载类
*/
public static void getClass(String className) {
Software software = null;
try {
Class c = Class.forName("com.hua.reflect."+className);// 获取类
software = (Software) c.newInstance(); // 实例化类
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
software.show(); }
public static void main(String[] args){ /**
* 编译加载类属于静态加载类,运行加载类属于动态加载类
* new 对象属于静态加载类,在编译时期就要加载所有可能用到的类。
* 通过使用动态加载类,类在使用时加载,不使用不加载。
*
*/
JavaReflect.getClass("Word");
知识点:
1、编译加载类属于静态加载类,运行加载类属于动态加载类。
2、new 对象属于静态加载类,在编译时期就要加载所有可能用到的类。
3、通过使用动态加载类,类在使用时加载,不使用不加载。
4、void 等关键字都有类类型。
5、获取类类型后就能获取类的相关信息。
6、反射的操作都是编译后的操作。
7、Java中的泛型是防止错误输入的,只在编译时期有效。ArrayList<String> == ArrayList
编译完成后泛型就不存在了,反射可以绕过编译将信息添加进去。
3、获取类中的相关信息
新建一个ClassUtil.java 帮助类
/**
* Created by 10113513 on 2016/06/06.
*/
public class ClassUtil { /**
* 显示类的相关信息
* @param obj
*/
public static void classMessage(Object obj) {
Class cs = obj.getClass();
System.out.println("类的全名称----------->" + cs.getName());
System.out.println("类的简写名称--------->" + cs.getSimpleName());
} /**
* 显示类中声明的方法
* @param obj
*/
public static void getMethods(Object obj){
Class cs = obj.getClass();
System.out.println("-------"+cs.getName()+"类中的方法");
Method[] methods = cs.getDeclaredMethods();
String show;
for (Method md : methods) {
show = md.getName() + md.getReturnType() + "(";
Class[] paramType = md.getParameterTypes();
for (Class c : paramType) {
show += c.getSimpleName() + ",";
}
show +=")";
System.out.println(show);
}
} /**
* 获取类的成员变量
* 只能获取公有的成员变量
* @param obj
*/
public static void getFiled(Object obj){
Class cs = obj.getClass();
System.out.println("-------"+cs.getName()+"类中的成员变量--------");
Field[] fds = cs.getFields();
for (Field fd:fds) {
System.out.println(fd.getName());
}
} /**
* 获取类中的构造函数
* @param obj
*/
public static void getConstructor(Object obj){
Class cs = obj.getClass();
System.out.println("-------"+cs.getName()+"类中的构造函数");
Constructor[] ctrs = cs.getConstructors();
String show = "";
for (Constructor ctr:ctrs) {
show += ctr.getName()+"(";
Parameter[] pars = ctr.getParameters();
for (Parameter par:pars) {
show += par.getName()+",";
}
show +=")";
System.out.println(show);
}
} }
4、获取方法的相关信息(获取的public的方法)
1>方法名和参数列表决定了方法的唯一性
2>方法反射的操作,method.invoke(对象,参数列表)
1>> 方法没有返回值返回null,又返回值返回具体返回值。
2>> 方法有参数列表就写成method.invoke(a1,int.class,int.class) 两个参数为例,
没有参数直接写成method.invoke(a1,int.class,int.class) 。
5、整体代码
JavaReflect.java
package com.hua.reflect; import com.description.dao.UserDao; /**
* Created by 华天 on 2016/06/06.
*/
public class JavaReflect {
public String animal;
private int num;
protected boolean isOk; public JavaReflect(){ }
public JavaReflect(String a){
System.out.println("do someThing");
} /**
* 动态加载类
* @param className
*/
public static void getClasses(String className) {
Software software = null;
try {
Class c = Class.forName("com.hua.reflect." + className);// 获取类
software = (Software) c.newInstance(); // 实例化类
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
software.show(); } /**
* 测试
* @param str
*/
public void test(String str) {
System.out.println("这是全部大写的测试方法:"+str.toUpperCase());
}
/**
* 测试1
*/
public void test1() {
System.out.println("这是全部小写的测试方法:"+"LIuBaoHua".toLowerCase());
} public static void main(String[] args) {
/*java 反射机制*/
// 获取类的方法
UserDao userDao = new UserDao();
Class c = UserDao.class; // 1、知道类名 .class
Class d = userDao.getClass(); // 2、知道对象 .getClass()
Class m = null; // 3、知道类的路径直接 class.forName("");
try {
m = Class.forName("com.description.dao.UserDao"); // 动态加载类
} catch (ClassNotFoundException e) {
e.printStackTrace();
} System.out.println("c d是否相等 : " + (c == d));
System.out.println("c m是否相等 : " + (c == m));
System.out.println("打印类名称:\n" + c.getName() + "\n" + d.getName() + "\n" + m.getName());
System.out.println("不包含包名的类名称:\n" + c.getSimpleName() + "\n" + d.getSimpleName()+ "\n" + m.getSimpleName()); try { UserDao ud = (UserDao) c.newInstance(); // 通过反射实例化一个对象,前提是UserDao必须有一个默认的无参构造方法
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
/**
* 1、编译加载类属于静态加载类,运行加载类属于动态加载类
* 2、new 对象属于静态加载类,在编译时期就要加载所有可能用到的类。
* 3、通过使用动态加载类,类在使用时加载,不使用不加载。
* 4、void 等关键字都有类类型
* 5、获取类类型后就能获取类的相关信息
*/
JavaReflect.getClasses("Word"); ClassUtil.classMessage(new JavaReflect()); ClassUtil.getMethods(new JavaReflect()); ClassUtil.getFiled(new JavaReflect()); ClassUtil.getConstructor(new JavaReflect()); // 参数列表
Class[] parms = new Class[]{String.class};
String[] strs = new String[]{"liubaohua"};
// 测试有参数
ClassUtil.getMethod(new JavaReflect(),"test",parms,strs);
// 测试无参数
ClassUtil.getMethod(new JavaReflect(),"test1",null,null); } }
ClassUtil.java
package com.hua.reflect; import java.lang.reflect.*; /**
* Created by 华天 on 2016/06/06.
*/
public class ClassUtil { /**
* 显示类的相关信息
* @param obj
*/
public static void classMessage(Object obj) {
Class cs = obj.getClass();
System.out.println("类的全名称----------->" + cs.getName());
System.out.println("类的简写名称--------->" + cs.getSimpleName());
} /**
* 显示类中声明的方法
* @param obj
*/
public static void getMethods(Object obj){
Class cs = obj.getClass();
System.out.println("-------"+cs.getName()+"类中的方法");
Method[] methods = cs.getDeclaredMethods();
String show;
for (Method md : methods) {
show = md.getName() + md.getReturnType() + "(";
Class[] paramType = md.getParameterTypes();
for (Class c : paramType) {
show += c.getSimpleName() + ",";
}
show +=")";
System.out.println(show);
}
} /**
* 获取类的成员变量
* 只能获取公有的成员变量
* @param obj
*/
public static void getFiled(Object obj){
Class cs = obj.getClass();
System.out.println("-------"+cs.getName()+"类中的成员变量--------");
Field[] fds = cs.getFields();
for (Field fd:fds) {
System.out.println(fd.getName());
}
} /**
* 获取类中的构造函数
* @param obj
*/
public static void getConstructor(Object obj){
Class cs = obj.getClass();
System.out.println("-------"+cs.getName()+"类中的构造函数");
Constructor[] ctrs = cs.getConstructors();
String show = "";
for (Constructor ctr:ctrs) {
show += ctr.getName()+"(";
Parameter[] pars = ctr.getParameters();
for (Parameter par:pars) {
show += par.getName()+",";
}
show +=")";
System.out.println(show);
}
} /**
* 获取特定的方法
* @param obj 类
* @param mdName 方法名
* @param parms 参数列表
* @param objs 传入参数
*/
public static void getMethod(Object obj,String mdName,Class[] parms,Object[] objs){
Class cs = obj.getClass();
System.out.println("----------"+cs.getName()+"类中的具体方操作------------");
try {
JavaReflect ncs = (JavaReflect) cs.newInstance();
// getDeclaredMethod(方法名,参数列表);
Method md = null;
if(parms == null){
md = cs.getDeclaredMethod(mdName);
// 调用方法
md.invoke(ncs);
}else{
md = cs.getDeclaredMethod(mdName,parms);
// 调用方法
md.invoke(ncs,objs);
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} } }
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用
对象的方法的功能称为java语言的反射机制。
Java反射机制--笔记的更多相关文章
- java反射机制(笔记)
java反射机制就是获取出class的相应方法 例如 获取构造函数: 模版: Class test = Class.forName("cn.test.Person");//得到相应 ...
- Java分享笔记:关于Java反射机制
[1] 关于Java反射机制的概述 1.反射机制的概念:允许程序在执行期,借助于反射相关的API,取得任何类的内部信息,并能直接操作任意对象内部的属性和方法. 2.与反射相关的主要的API:java. ...
- 第28章 java反射机制
java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...
- Java反射机制
Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射: 静态编译:在编译时确定类型,绑定对象,即通过 ...
- java基础知识(十一)java反射机制(上)
java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...
- java基础知识(十一)java反射机制(下)
1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...
- Java反射机制专题
·Java Reflection Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方 ...
- java反射机制深入详解
java反射机制深入详解 转自:http://www.cnblogs.com/hxsyl/archive/2013/03/23/2977593.html 一.概念 反射就是把Java的各种成分映射成 ...
- Java反射机制DOME
Java反射机制 public class TestHibernate { @Test public void TestHb(){ try { Class cs = Class.forName(&qu ...
随机推荐
- Configuring HDFS High Availability
Configuring HDFS High Availability 原文请訪问 http://blog.csdn.net/ashic/article/details/47024617,突袭新闻小灵儿 ...
- there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause
建表语句: create table test_table( id integer not null auto_increment primary key, stamp_created tim ...
- C++代码统计工具
自己前几天写的C++代码统计工具. http://pan.baidu.com/s/17SnnH
- App优化 Systrace
简介 trace [tres] vt.跟踪,追踪; 追溯,探索; 探索; 查找; n.痕迹; 痕迹,踪迹; 微量,极少量; 1 1 1 trace [tres] vt.跟踪,追踪; 追溯,探索; ...
- [JSP]JSP中include指令和include动作的差别
include指令是编译阶段的指令,即include所包括的文件的内容是编译的时候插入到JSP文件里,JSP引擎在推断JSP页面未被改动,否则视为已被改动. 因为被包括的文件是在编译时才插入的.因此假 ...
- Java 中 Map 的使用
Map接口提供了一组能够以键-值对(key,value)形式存储的数据结构. Map对存入元素仅仅有一个要求.就是键(key)不能反复,Map对于key.value要求不是非常严格,key仅仅要是引用 ...
- jQuery cssHook的经典例子
/*--------------------------- example ------------------------------*/ $.cssHooks.foo = { get: fun ...
- [CSS] Collapsing Margins
Refactor the spacing between <header>, <article>, and <aside> so that elements wil ...
- [Node.js]30. Level 6: Listen 'Question' from client, and then Answer the Question
Clients can also answer each other questions, so let's build that feature by first listening for the ...
- 【Canvas】动态正17边光阑 向高斯致敬
[背景知识] 公元前三世纪,欧几里得在<几何原本>中记载了正方形,正五边形,正六边形的做法,后来人们也掌握了正十五边形作图,但之后两千多年,人们没有在更高阶边形上取得突破. 1796年,1 ...