java 反射简说
1 Class类
就是类的类型。研究反射先了解下Class类。
获取类的类型的三种方法:
Class c1 = 对象.getClass();
Class c2 = Class.forName("包名.类名");
Class c3 = 类.class();
Class类的newInstance();方法调用缺省构造函数,返回该Class对象的一个Object类型的实例。
2 反射
在运行时构造任意一个类的对象;获取类的属性,方法;调用方法。
3 举例
person类
public class Person {
private static String TAG = "person";
public String name = "";
private int age = 18;
public Person(){
}
public Person(Integer age){
this.age = age;
}
private void see(){
Log.e(TAG, "person see()");
}
public void run(){
Log.e(TAG, "person run()");
}
public void setAge(int age){
Log.e(TAG, "person setAge():" + age);
this.age = age;
}
public void setPerson(String name, Integer age){
Log.e(TAG, "person setPerson():name:" + name + ", age" + age);
this.name = name;
this.age = age;
}
}
另一类
private void getPerson(){
// 获取Person类的类类型
Class c1 = Person.class;
try {
// 实例c1指向的类型
Object object = c1.newInstance();
// 获取run方法(无参)
Method method = c1.getDeclaredMethod("run");
// 运行run方法
method.invoke(object);
// 获取setAge方法(一个参数)
Method method1 = c1.getDeclaredMethod("setAge", int.class);
// 运行setAge,设置为20
method1.invoke(object, 20);
// 获取setAge方法(二个参数)
Method method2 = c1.getDeclaredMethod("setPerson", String.class, Integer.class);
method2.invoke(object, "xiaohong", 30);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
try {
invokeMethod(new Person(), "setPerson", "dayun", 20);
} catch (Exception e) {
e.printStackTrace();
}
}
// 工具类
public Object invokeMethod(Object object, String methodName, Object... args) throws Exception {
Class c = object.getClass();
Class[] argsClass = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}
Method m = c.getMethod(methodName, argsClass);
return m.invoke(object, args);
}
反射int类型需要处理,int.getClass为Integer,代用工具类时需要注意int类型参数
if(args[i].getClass().equals(Integer.class)){
argsClass[i] = int.class;
}else{
argsClass[i] = args[i].getClass();
}
java 反射简说的更多相关文章
- java反射简解
1.首先一个问题,什么是类,类是不是对象? 我们总是说我们new一个对象出来 那么我们还没有new的时候,建造的那个java类是不是对象呢? 是 它是java.lang.Class的对象 对于反射我们 ...
- Android简易注解View(java反射实现)
一.引言 Android中通过findViewById在布局文件中找到需要的View,加入一个Activity里面有许多的View需要初始化,那将是一件很繁琐的事情.当然Google一下你会发现有很多 ...
- Java 反射 设计模式 动态代理机制详解 [ 转载 ]
Java 反射 设计模式 动态代理机制详解 [ 转载 ] @author 亦山 原文链接:http://blog.csdn.net/luanlouis/article/details/24589193 ...
- 【转】JAVA反射与注解
转载自:https://www.daidingkang.cc/2017/07/18/java-reflection-annotations/ 前言 现在在我们构建自己或公司的项目中,或多或少都会依赖几 ...
- Java反射拾遗
定义:Java反射机制可以让我们在编译期(Compile Time)之外的运行期(Runtime)检查类,接口,变量以及方法的信息.反射还可以让我们在运行期实例化对象,调用方法,通过调用get/set ...
- Java反射03 : 获取Class的注解、修饰符、父类、接口、字段、构造器和方法
java.lang.Class类提供了获取类的各种信息对象的静态方法. 本文转载自:https://blog.csdn.net/hanchao5272/article/details/79363921 ...
- 第28章 java反射机制
java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...
- Java反射机制
Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射: 静态编译:在编译时确定类型,绑定对象,即通过 ...
- java反射(基础了解)
package cn.itcast_01; /** *Person类 */ public class Person { /** 姓名 */ private String name; ...
随机推荐
- 关于隐式创建vue实例实现简化弹出框组件显示步骤
我们在使用vue写alert组件的时候,经常是定义了一个alert.vue,然后引入alert.vue,然后配置参数等等,非常繁琐,那有没有一种方式可以像window.alert("内容&q ...
- classList用法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Linux三种网络连接模式
https://www.cnblogs.com/linjiaxin/p/6476480.html 三种模式的区别:https://www.cnblogs.com/itxiaok/p/10358055. ...
- mac 中git操作账号的保存与删除
保存: 在mac中自动保存git的用户名和密码很简单,只需要在终端命令行中输入下面的命令就是: git config --global credential.helper osxkeychain 然后 ...
- vue keep-alive 取消某个页面缓存问题
keep-alive keep-alive是Vue提供的一个抽象组件,用来对组件进行缓存,从而节省性能,由于是一个抽象组件,所以在v页面渲染完毕后不会被渲染成一个DOM元素 <keep-aliv ...
- 移动端input输入placeholder垂直不居中
在移动端编写input输入框时候,为了输入文字与输入框垂直居中,一般情况下,会将input的line-height的高度等于height.但在移动端输入的时候会发现,虽然输入内容确实是垂直居中了,但是 ...
- 笔记《JavaScript 权威指南》(第6版) 分条知识点概要2—类型、值、变量
[类型.值.变量]数字.文本.布尔值.null和undefined.全局对象.包装对象.不可变的原始值和可变的对象引用.类型转换.变量声明.变量作用域 P44~71(PDF版).P32~59(书版) ...
- Qt 适合做界面
确实感觉的Qt的界面开发相比MFC方便了许多,不用为设计和实现窗口烦恼.不需要太细研究界面的实现,从Qt自带的例子中就能轻松学习和应用.在界面开发上Qt的实用比MFC前进了许多.做C++开发不管怎样如 ...
- CentOS 7安装部署ELK 6.2.4-SUCCESS
一.ELK介绍 ELK是三款开源软件的缩写,即:ElasticSearch + Logstash + Kibana.这三个工具组合形成了一套实用.易用的监控架构,可抓取系统日志.apache日志.ng ...
- myBatis简学
mybatis使用: ①拷贝相关mybits ②编写对象关系映射,一般都是实体类名+Mapper.xml的格式 ③编写mybits配置文件: a)配置环境 b)配置映射文件地址 ④编写对象操作方法: ...