--2013年7月26日17:56:35

写文章之前,参考了这篇:http://www.cnblogs.com/Quincy/archive/2011/06/19/2084557.html

评价:这个作者写的像个字典,我照着看了,里面的代码觉得乱,还是自己整理一篇。

--先看一段代码,这段代码,基本可以演示反射我想总结的东西.

 package com.dev;

 import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier; class Tst { //提供反射用的类
private int x;
public int y;
public String str1 = "abc";
public String str2 = "123";
public Tst(){};
public Tst(int x, int y) {
super();
this.x = x;
this.y = y;
}
@Override
public String toString() {
return "Tst [x=" + x + ", y=" + y + ", str1=" + str1 + ", str2=" + str2
+ "]";
} }
public class ReflectClass { public static void main(String[] args) throws Throwable {
Tst tst = new Tst(1,2);
changeField(tst);
printClass(tst);
getFields(tst);
printConstructors(tst);
printMethods(tst);
} private static void printClass(Object obj) throws Throwable{ Class<?> clazz = obj.getClass(); String modifers = Modifier.toString(clazz.getModifiers());
if(modifers.length() > 0);
log("--class basic info--");
log("modifers=" +modifers);
log("className()=" + clazz.getName());
Class<?> superClasses = clazz.getSuperclass();
if(superClasses != null && !Object.class.equals(superClasses)){
log("extends:" + superClasses.getName() + " ");
} Class<?>[] interfaces = clazz.getInterfaces();
if(interfaces.length > 0){
log("implents--");
for(Class<?> interfacez : interfaces){
log("impls="+interfacez.getName());
}
}
} private static void getFields(Object obj) throws Exception{
Class<?> clazz = obj.getClass();
Field[] fields = clazz.getDeclaredFields();
log("--class fields info--");
for(Field field : fields){
String modifers = Modifier.toString(field.getModifiers());
String fName = field.getName();
// fieldX.setAccessible(true);
field.setAccessible(true);
Object val = (Object)field.get(obj);
log( fName+"="+val+",modifers="+modifers+",type="+field.getType().getName() );
// log("modifers="+modifers+",type="+field.getType().getName() + ",name=" + fName+",val="+clazz.getField(fName));
}
} private static void printConstructors(Object obj){
Class<?> clazz = obj.getClass();
log("--class constructor info--");
Constructor<?>[] constructors = clazz.getConstructors();
log("constructors total count ="+ constructors.length);
for(Constructor<?> constructor : constructors){ String modifers = Modifier.toString(constructor.getModifiers());
if(modifers.length() > 0);
Class<?>[] parameterTypes = constructor.getParameterTypes();
log("modifers="+modifers+",CONSName="+constructor.getName() + "--parameterCount="+parameterTypes.length);
for(Class<?> parameterType : parameterTypes){
log("paramter="+parameterType.getName());
}
}
} private static void printMethods(Object obj){
Class<?> clazz = obj.getClass();
log("--class Methods info--");
Method[] methods = clazz.getMethods();
int i = 1;
for(Method method : methods){
String modifers = Modifier.toString(method.getModifiers());
Class<?> returnType = method.getReturnType();
Class<?>[] parameterTypes = method.getParameterTypes();
String mName = method.getName();
log(methods.length+"-"+i+":"+mName+"()-modifers="+modifers+",returnType="+returnType.getName());
i++;
for(Class<?> parameterType : parameterTypes){
log(" "+parameterTypes.length+"lparameterType="+parameterType.getName());
}
}
}
private static void changeField(Object obj) throws Exception{
log("--before="+obj);
Field field = obj.getClass().getField("str1");
field.set(obj, "after22");
log("--after="+obj);
}
private static void log(String log){
System.out.println(log);
}
}

知识点1:获得某个类的字节码类对象(Class)的方法有3种:

1、ReflectPoint.class (类名.class)
2、reflectPoint.getClass() (对象名.getClass())
3、Class.forName("com.juziku.ReflectPoint") (Class.forName(类名的路径))

知识点2:获得Field类对象,得到这个对象就可以进行操作了

JAVA 的Class<T>类提供了几个方法获取类的属性。

public Field getField(String name) 返回一个 Field 对象,返回值是一个属性对象,用这个返回对象可以操作这个属性。

public Field[] getFields() 返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段

public Field getDeclaredField(String name) 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段

public Field[] getDeclaredFields() 返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段

知识点3:获取类的Method

public Method getMethod(String name, Class<?>... parameterTypes)返回一个 Method 对象
public Method[] getMethods()返回一个包含某些 Method 对象的数组
public Method getDeclaredMethod(String name,Class<?>... parameterTypes)
返回一个 Method 对象
public Method[] getDeclaredMethods()返回 Method 对象的一个数组,
这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法

知识点:----

这里其实大概的思想要有,就是用反射包里面的类,获取对象,然后就和普通对象一样进行反射操作。

剩下的参考文档吧,或者仔细看上面的代码。

java笔记01-反射的更多相关文章

  1. Java笔记 #01# 最近遇到的几个Throwable

    续<Java入门第三季>第一章 异常与异常处理. 1.StackOverflowError 第一次碰到这个 Error 居然有点小激动,原因当然是因为它叫 StackOverflow Q: ...

  2. java笔记01

    java对象数组 Student[] Students = new Student[3]; 与普通数组无差 java集合类 集合类: 面向对象对事物的描述是通过对象来体现的. 为了方便对多个对象进行操 ...

  3. JAVA笔记01 变量的取名

    第2章 有意义的命名2.1 介绍2.2 名副其实 变量名太随意,haha.list1.ok 这些都没啥意义2.3 避免误导 包含List等关键字.字母o与数字0等2.4 做有意义的区分 反面教材,变量 ...

  4. Java:并发笔记-01

    Java:并发笔记-01 说明:这是看了 bilibili 上 黑马程序员 的课程 java并发编程 后做的笔记 1. 进程与线程 本章内容 进程和线程的概念 并行和并发的概念 线程基本应用 1.1 ...

  5. Java注解和反射笔记

    Java注解和反射笔记 1 注解 1.1 定义 Annotation是从JDK1.5开始引入的技术 作用 不是程序本身,可以对程序作出解释 可以被其他程序(编译器等)读取 格式 @注释名,可以添加一些 ...

  6. 【Java编程思想笔记】反射

    文章参考:学习网站 how2java.cn 参考博客:(敬业的小码哥)https://blog.csdn.net/sinat_38259539/article/details/71799078 (青色 ...

  7. Java基础知识_毕向东_Java基础视频教程笔记(26 反射)

    Java反射机制: 是在运行状态中,对于任意一个类(class)文件,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性.这种动态获取的信息以及动态调用对象的方法的功 ...

  8. java笔记十:java中的反射

    Java中,反射是一种强大的工具.它使您能够创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代表链接.反射允许我们在编写与执行时,使我们的程序代码能够接入装载到JVM中的类的内部信息,而 ...

  9. Java 学习笔记(15)——反射

    Java中的类文件最终会被编译为.class 文件,也就是Java字节码.这个字节码中会存储Java 类的相关信息.在JVM执行这些代码时首先根据 java 命令中指定的类名找到.class 文件然后 ...

  10. java笔记整理

    Java 笔记整理 包含内容     Unix Java 基础, 数据库(Oracle jdbc Hibernate pl/sql), web, JSP, Struts, Ajax Spring, E ...

随机推荐

  1. 如何用十条命令在一分钟内检查Linux服务器性能

    “如果你的Linux服务器突然负载暴增,报警短信快发爆你的手机,如何在最短时间内找出Linux性能问题所在?来看Netflix性能工程团队的这篇博文,看它们通过十条命令在一分钟内对机器性能问题进行诊断 ...

  2. 第二百六十天 how can I 坚持

    晚上去看了个电影,<万万没想到>,挺好看的,豆瓣评分不高.网络啊. 互联网会让聪明的人越来越聪明. 明天去看寻龙诀了. 懒惰会生根发芽,哈哈. 睡觉了.

  3. Argument 'xxx' is not a function, got undefined,初学Angular的第一个坑

    终于考完试了,在没更新的这一段时间里,一直都在忙于应付考试.不过在期间也是接触到不少好玩的东西,比如Html5的Canvas,我用lufylegend的Html5引擎做了个<看你有所色>的 ...

  4. Java邮件服务学习之五:邮箱服务服务端 Apache

    Apache James(Java Apache Mail Enterprise Server)是Apache组织的子项目之一,完全采用纯Java技术开发,实现了SMTP.POP3与NNTP等多种邮件 ...

  5. delphi回调函数

    文章来源: http://anony3721.blog.163.com/blog/static/5119742010866050589/ 一.主单元 unit UnMain; interface us ...

  6. oracle中in与exists的区别

    exists是用来判断是否存在的,当exists中的查询存在结果时则返回真,否则返回假.not exists则相反. exists做为where 条件时,是先对where 前的主查询询进行查询,然后用 ...

  7. poj 1679 http://poj.org/problem?id=1679

    http://poj.org/problem?id=1679 The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submis ...

  8. [iOS微博项目 - 1.0] - 搭建基本框架

    A.搭建基本环境   github: https://github.com/hellovoidworld/HVWWeibo   项目结构:   1.使用代码构建UI,不使用storyboard     ...

  9. application/xml和text/xml的区别

    XML有两个MIME类型,application/xml和text/xml,它们之间的区别是: text/xml忽略xml文件头中的关于编码的设定(<?xml version="1.0 ...

  10. 剑指OFFER之变态跳台阶(九度OJ1389)

    题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入包括一个整数n(1 ...