java reflection总结
一、java反射常用方法
获取Class的几种方式:
Class class1 = String.class;// 该方法最为安全可靠,程序性能更高。
Class class2 = string.getClass();
Class class3 = Class.forName("java.lang.String");// 可能抛出ClassNotFoundException异常
Class class = Integer.TYPE;//不能用第一种方式
获取内部类:
getDeclaredClasses()
获取本类中声明的字段:
getDeclaredFields()
getDeclaredField(String name)
获取本类中声明的方法:
getDeclaredMethods()
getDeclaredMethod(String name, Class...<?> parameterTypes)
获取本类中声明的构造函数
getDeclaredConstructors()
getDeclaredConstructor(Class...<?> parameterTypes)
通过反射设置字段属性(还有方法来获取,get(Object object))
set(Object object, Object value)
通过反射调用方法(也可以获取方法的一些其他属性)
invoke(Object receiver, Object... args)
通过反射生成对象(也可以获取构造函数的一些其他属性)
newInstance(Object... args)
二、Java Annotation
请参考http://www.cnblogs.com/mandroid/archive/2011/07/18/2109829.html。
这部分在代码注释中去理解。
三、改变字段(域)的值
Field.java
import java.lang.reflect.*;
public class Field2 {
public double d;
public static void main(String args[]) {
try {
Class cls = Class.forName("Field2");
Field fld = cls.getField("d");
Field2 f2obj = new Field2();
System.out.println("d = " + f2obj.d);
fld.setDouble(f2obj, 12.34);
System.out.println("d = " + f2obj.d);
}
catch (Throwable e) {
System.err.println(e);
}
}
}
输出结果:
四、根据方法的名称来执行方法
Method2.java
import java.lang.reflect.*;
public class Method2 {
public int add(int a, int b) {
return a + b;
}
public static void main(String args[]) {
try {
Class cls = Class.forName("Method2");
//Class partypes[] = new Class[2];
//partypes[0] = Integer.TYPE;
//partypes[1] = Integer.TYPE; Method meth = cls.getMethod("add", new Class[]{Integer.TYPE,Integer.TYPE});
Method2 methobj = new Method2();
//Object arglist[] = new Object[2];
//arglist[0] = new Integer(37);
//arglist[1] = new Integer(47);
Object retobj = meth.invoke(methobj, new Object[]{new Integer(37),new Integer(47)});
Integer retval = (Integer) retobj;
System.out.println(retval.intValue());
}
catch (Throwable e) {
System.err.println(e);
}
}
}
五、创建新的对象
Constructor2.java
import java.lang.reflect.*;
public class Constructor2 {
public Constructor2() {
}
public Constructor2(int a, int b) {
System.out.println("a = " + a + " b = " + b);
}
public static void main(String args[]) {
try {
Class cls = Class.forName("Constructor2");
//Class partypes[] = new Class[2];
//partypes[0] = Integer.TYPE;
//partypes[1] = Integer.TYPE;
Constructor ct = cls.getConstructor(new Class[]{Integer.TYPE,Integer.TYPE});
//Object arglist[] = new Object[2];
//arglist[0] = new Integer(37);
//arglist[1] = new Integer(47);
Object retobj = ct.newInstance(new Object[]{new Integer(37),new Integer(47)});
}
catch (Throwable e) {
System.err.println(e);
}
}
}
java reflection总结的更多相关文章
- Java Reflection(getXXX和getDeclaredXXX)
package com.sunchao.reflection; public class Person { private int age ; private String name; public ...
- java Reflection(反射)基础知识讲解
原文链接:小ben马的java Reflection(反射)基础知识讲解 1.获取Class对象的方式 1.1)使用 "Class#forName" public static C ...
- Java Reflection
Java语言的反射机制 1. Java反射的含义:获取应用中正在运行的Java对象. 2. Java反射机制: 在运行的程序中,对于任意的类,都可以知道这个类的属性.方法以及构造函数,对于任意对象都可 ...
- Java Reflection 反射基础
反射基础: package reflection; /** * Created by : Infaraway * DATE : 2017/3/2 * Time : 23:06 * Funtion : ...
- Some Link: Java Reflection
http://docs.oracle.com/javase/tutorial/reflect/index.html https://bugs.openjdk.java.net/browse/JDK-4 ...
- Java Reflection - Getters and Setters
原文链接:http://tutorials.jenkov.com/java-reflection/getters-setters.html 通过使用 Java 反射,我们能够在程序执行时观察 clas ...
- Java Reflection (JAVA反射) --转载
对于软件开发人员来说,单元测试是一项必不可少的工作.它既可以验证程序的有效性,又可以在程序出现 BUG 的时候,帮助开发人员快速的定位问题所在.但是,在写单元测试的过程中,开发人员经常要访问类的一些非 ...
- Java Annotations, Java Reflection, and Java Test Runner
www.vogella.com/tutorials/JavaAnnotations/article.html
- Java反射(Reflection)
基本概念 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法? 答案是肯定的. 这种动态获取类的信息以及动态调用对象的方法的功能来自于J ...
随机推荐
- webapi文档
webapi文档描述-swagger 最近做的项目使用mvc+webapi,采取前后端分离的方式,后台提供API接口给前端开发人员.这个过程中遇到一个问题后台开发人员怎么提供接口说明文档给前端开发人员 ...
- Oracle EBS-SQL (OM-2):检查OM常用表
--多语言视图 ALTER SESSION SET NLS_LANGUAGE=AMERICAN ; --组织化视图 BEGIN FND_CLIENT_INFO.set_org_context(218) ...
- WMI问题终极解决
1. 如果用JInterOp,先用这篇文章叙述的: http://m.oschina.net/blog/73163 2.另外开启这个: https://dev.c-ware.de/confluence ...
- vs2010中看不见类视图和资源视图的解决方法
vs2010工程中,因为删除了“vcxproj.filter”文件,所以导致资源视图看不见了. 解决方法是:先关掉工程,将工程对应的扩展名为.suo和.sdf删除,重新打开解决方案,问题解决.
- linux C之access函数 (20
http://blog.sina.com.cn/s/blog_6a1837e90100uh5d.html linux C之access函数 (20access():判断是否具有存取文件的权限 相关函数 ...
- poj2488 A Knight's Journey
A Knight's Journey Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 24840 Accepted: ...
- asp.net web api的自托管模式HttpSelfHostServer可以以控制台程序或windows服务程序为宿主,不单单依赖于IIS web服务器
Self-Hosting ASP.NET Web API http://theshravan.net/self-hosting-asp-net-web-api/ http://www.piotrwal ...
- Unity 利用NGUI2.6.3做技能冷却的CD效果
NGUI非常强大我们今天来学习一下,如何利用NGUI做技能冷却的CD效果.先导入NGUI的插件.没有的话这里有啊NGUI2.6.3下载地址: http://vdisk.weibo.com/s/KLqn ...
- JS实现文本复制与剪切
我们在网页上放置一个复制按钮,主要用来方便用户复制链接之类的复杂文本,以往的做法是,通过JS依靠Flash,甚至借助jQuery庞大的js库来实现文本复制到剪贴板的.今天我要给大家介绍的是一款极现代的 ...
- 小心ThreadLocal的陷阱
ThreadLocal用在多线程时保存线程级的局部变量,当我们需要在线程内共享数据时,ThreadLocal屡试不爽,但是ThreadLocal也会有一个问题,当你使用线程池时,线程可能会被重用,所以 ...