一、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. 合成孔径雷达(Synthetic Aperture Radar, SAR)

    合成孔径雷达(Synthetic Aperture Radar, SAR)是20世纪最先进的科技发明之一.SAR有机载与卫载系统之分,能提供地表地形.乃至行星等远距离目标区高解析度图像.目前无人飞行载 ...

  2. 如何测试私有 Private/Internal 方法

    在实际开发中,经常会遇到这样的情况. 一个共有的 Public 方法实现某一主要功能,但是由于该功能的实现非常复杂,需要很多的辅助类,辅助方法.由于代码封装性的需求,我们通常需要把这些辅助的类方法定义 ...

  3. logcat错误日志

    http://www.crifan.com/android_log_to_file/ http://www.iteye.com/problems/85431 http://www.cnblogs.co ...

  4. OC基础4:类和方法

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.类的声明(@interface)要放在 ...

  5. sqlplus中隐患组合键

    在UNIX/Linux平台中的SQL*Plus命令行提示符下,如果误按了组合键:Ctrl+S,那么这个会话将被锁定,输入任何命令都没有显示出来的. 解锁组合键:Ctrl+Q 注意:在使用ctrl+s锁 ...

  6. java PriorityBlockingQueue 基于优先级队列,的读出操作可以阻止.

    java PriorityBlockingQueue 基于优先级队列.的读出操作可以阻止. package org.rui.thread.newc; import java.util.ArrayLis ...

  7. 你知道为什么Xcode6中Swift没有智能提示和自己主动补全功能吗 ?

    你知道为什么Xcode6中Swift没有智能提示和自己主动补全功能吗 ? 长沙戴维营教育将为你解开这个巨大的谜团大BUG! http://www.ubuntucollege.cn/course/29/ ...

  8. 从linux telnet到exchange邮件server来測试发送邮件

    我们在Linux下,能够通过telnet邮件server的25port(一般smtp邮件server都是这个),来測试是否能发送邮件. 前提是先得把DNS配好,或者/etc/hosts文件制定好邮件s ...

  9. javascript中的同源策略

    如果两个页面拥有相同的协议(protocol),端口(如果指定),和主机,那么这两个页面就是属于同一个源 览器有一个很重要的概念——同源策略(Same-Origin Policy).所谓同源是指,域名 ...

  10. UVA 1601 The Morning after Halloween

    题意: 给出一个最大为16×16的迷宫图和至多3个ghost的起始位置和目标位置,求最少经过几轮移动可以使三个ghost都到达目标位置.每轮移动中,每个ghost可以走一步,也可以原地不动,需要注意的 ...