一、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总结的更多相关文章

  1. Java Reflection(getXXX和getDeclaredXXX)

    package com.sunchao.reflection; public class Person { private int age ; private String name; public ...

  2. java Reflection(反射)基础知识讲解

    原文链接:小ben马的java Reflection(反射)基础知识讲解 1.获取Class对象的方式 1.1)使用 "Class#forName" public static C ...

  3. Java Reflection

    Java语言的反射机制 1. Java反射的含义:获取应用中正在运行的Java对象. 2. Java反射机制: 在运行的程序中,对于任意的类,都可以知道这个类的属性.方法以及构造函数,对于任意对象都可 ...

  4. Java Reflection 反射基础

    反射基础: package reflection; /** * Created by : Infaraway * DATE : 2017/3/2 * Time : 23:06 * Funtion : ...

  5. Some Link: Java Reflection

    http://docs.oracle.com/javase/tutorial/reflect/index.html https://bugs.openjdk.java.net/browse/JDK-4 ...

  6. Java Reflection - Getters and Setters

    原文链接:http://tutorials.jenkov.com/java-reflection/getters-setters.html 通过使用 Java 反射,我们能够在程序执行时观察 clas ...

  7. Java Reflection (JAVA反射) --转载

    对于软件开发人员来说,单元测试是一项必不可少的工作.它既可以验证程序的有效性,又可以在程序出现 BUG 的时候,帮助开发人员快速的定位问题所在.但是,在写单元测试的过程中,开发人员经常要访问类的一些非 ...

  8. Java Annotations, Java Reflection, and Java Test Runner

    www.vogella.com/tutorials/JavaAnnotations/article.html

  9. Java反射(Reflection)

    基本概念 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法? 答案是肯定的. 这种动态获取类的信息以及动态调用对象的方法的功能来自于J ...

随机推荐

  1. Python 函数 切片 迭代 列表生成器

    函数 编写     定义一个函数要用def语句    def sum(i,n):   ⚠有冒号 返回多值     实际上是返回一个tuple 定义默认参数    默认参数的作用是简化调用   def ...

  2. Oracle EBS-SQL (INV-11):检查子库存会计信息.sql

    select          OOD.ORGANIZATION_CODE                                               库存组织代码,          ...

  3. 设置edittext的hint位置

    <EditText android:id="@+id/edt_content" android:layout_width="fill_parent" an ...

  4. C++中基类的析构函数为什么要用virtual虚析构函数

    知识背景 要弄明白这个问题,首先要了解下C++中的动态绑定. 关于动态绑定的讲解,请参阅:  C++中的动态类型与动态绑定.虚函数.多态实现 正题 直接的讲,C++中基类采用virtual虚析构函数是 ...

  5. MS Sql 查询数据库连接数

    SELECT * FROM [Master].[dbo].[SYSPROCESSES] WHERE [DBID] IN (SELECT [DBID]FROM [Master].[dbo].[SYSDA ...

  6. nyoj 43 24 Point game(dfs暴力)

    描述 There Point game. In .The expression mustn't have any other operator except plus,minus,multiply,d ...

  7. OAuth2.0开发指南

    OAuth2.0开发指南 1.认证与登录 来往开放平台支持3种不同的OAuth 2.0验证与授权流程: 服务端流程(协议中Authorization Code Flow): 此流程适用于在Web服务端 ...

  8. ORACLE AWR概述及生成AWR报告

    1.Overview of the Automatic Workload Repository The Automatic Workload Repository (AWR) collects, pr ...

  9. 【线段树求最靠前】【HDU2795】【Billboard】

    题意: 有一个H*W的广告牌,当插入一个广告时(1*Wi),问最靠前的插入方式是什么 新生赛有个类似的题目,可惜当时居然没水过去. 果断用线段树做 以H为线段 建树,存[l,r]中最大的宽度,因为区间 ...

  10. .Net 缓存依赖详解

    缓存命名空间的讲解流程 16.1  System.Web.Caching简介 本节从缓存命名空间的总体简介和组成结构入手,从整体上对System.Web.Caching进行概述. 16.1.1  Sy ...