1、java 反射的作用(好处):

(1)能够使我们很方便的创建灵活的代码,这些代码可以在运行时装配(运行时获取一个类实例),就不用在组件之间进行源代码链接了,大大提高系统的灵活性和扩展性。

(2)与Java动态编译相结合,可以实现无比强大的功能。

2、java的反射的负作用:

(1)使用反射的性能较低 
(2)使用反射相对来说不安全 
(3)破坏了类的封装性,可以通过反射获取这个类的私有方法和属性

3、反射实现要做的事:

(1)反编译:.class->.java

(2)通过反射机制访问java对象的属性,方法,构造方法等。

4、反射要用到的反射机制中的类:

java.lang.Class;

java.lang.reflect.Constructor;

java.lang.reflect.Method;

java.lang.reflect.Modifider;

5、具体功能的实现:

(1)反射实现的具体方法:下面来获取Demo类型

  1)、Clazz1 = Class.forName("Demo");

  2) 、 Clazz2 = Demo.class;

  3) 、 Demo demo = new Demo();

      Clazz3 = demo.getClass();

(2) 创建对象:获取类以后就可以创建对应的对象,利用newInstance;

  Class c = Class.forName("Demo");

  Object  = c.newInstance(); //调用了 Demo的无参数构造方法。

(3)获取属性:包括所有属性和指定属性。

  获取所有属性的写法:

package com.test;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier; /**
* Created by Administrator on 2016/11/13.
*/
public class ClazzTest { public static void main(String [] args){
//获取整个类
try {
Class c = Class.forName("java.lang.Integer");
//获取所有的属性
Field[] fs =c.getDeclaredFields();
//定义StringBuffer 来存储属性
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(Modifier.toString(c.getModifiers())+" class "+c.getSimpleName()+"{\n");
//里边的每一个属性
for (Field field:fs){
stringBuffer.append("\t");
stringBuffer.append(Modifier.toString(field.getModifiers())+"");//获得属性的修饰符
stringBuffer.append(field.getType().getSimpleName()+"");//属性类型的名称
stringBuffer.append(field.getName()+";\n");
}
stringBuffer.append("}");
System.out.print(stringBuffer);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} }
}

输出结果:

public final class Integer{
public static final int MIN_VALUE;
public static final int MAX_VALUE;
public static final ClassTYPE;
static final char[] digits;
static final char[] DigitTens;
static final char[] DigitOnes;
static final int[] sizeTable;
private final int value;
public static final int SIZE;
public static final int BYTES;
private static final long serialVersionUID;
}

  获取特定属性:

package com.test;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.lang.Integer;
/**
* Created by Administrator on 2016/11/13.
*/
public class ClazzTest { public static void main(String [] args){
/*
User u = new User();
u.age = 12; //set
System.out.println(u.age); //get
*/ //获取整个类
try {
Class c = Class.forName("User");
//获取所有的属性
Field fs =c.getDeclaredField("age"); //不能是静态的属性和final属性
//实例化
Object i = c.getInterfaces();
//打破封装
fs.setAccessible(true);
fs.set(i,20);
System.out.print(fs.get(i)); } catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} }
}

获取方法,和构造方法,不再详细描述,只来看一下关键字:

方法关键字

含义

getDeclaredMethods()

获取所有的方法

getReturnType()

获得方法的放回类型

getParameterTypes()

获得方法的传入参数类型

getDeclaredMethod("方法名",参数类型.class,……)

获得特定的方法

构造方法关键字

含义

getDeclaredConstructors()

获取所有的构造方法

getDeclaredConstructor(参数类型.class,……)

获取特定的构造方法

父类和父接口

含义

getSuperclass()

获取某类的父类

getInterfaces()

获取某类实现的接口

java 反射机制复习笔记。的更多相关文章

  1. java反射机制(笔记)

    java反射机制就是获取出class的相应方法 例如 获取构造函数: 模版: Class test = Class.forName("cn.test.Person");//得到相应 ...

  2. java反射机制学习笔记

    内容引用自:https://www.cnblogs.com/wkrbky/p/6201098.html https://www.cnblogs.com/xumBlog/p/8882489.html,本 ...

  3. JAVA的反射机制学习笔记(二)

    上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了.自己的步伐全然被打乱了~不能继续被动下去.得又一次找到自己的节奏. 4.获取类的Constructor 通过反射机制得到 ...

  4. Java反射机制--笔记

    1.认识Class类 任何一个类都是Class类的实例对象,这个实例对象有三种表示方式. /*java 反射机制*/ // 获取类的方法 UserDao userDao = new UserDao() ...

  5. Java分享笔记:关于Java反射机制

    [1] 关于Java反射机制的概述 1.反射机制的概念:允许程序在执行期,借助于反射相关的API,取得任何类的内部信息,并能直接操作任意对象内部的属性和方法. 2.与反射相关的主要的API:java. ...

  6. Java二次复习笔记(1)

    Java二次复习笔记(1) Java采用的默认字符编码集是Unicode. byte=byte+byte报错,值为int,而byte+=byte不报错.同样short = short+short报错, ...

  7. 第28章 java反射机制

    java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...

  8. Java反射机制

    Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射:     静态编译:在编译时确定类型,绑定对象,即通过 ...

  9. java基础知识(十一)java反射机制(上)

    java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...

随机推荐

  1. GUN C中的socket学习(一)

    socket是用于通信的工具. 套接字其实是一个广义上的进程间通信的信道.就像pipe一样,在GUN环境下socket也被用一个文件表示.不同的socket文件可以用于不同的进程间通信,甚至可以用来在 ...

  2. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)2.2——将Eclipse开发的项目导入到AndroidStudio

    问题: 你想要将一个Eclipse ADT项目导入到Android Studio中. 解决方案: Android Studio提供了一个导入向导,可以重写已有的项目. 详细: 在Android Stu ...

  3. python redis操作

    import redis r = redis.Redis( host='1xx.x24.3xx.x0', #ip, password='xnxnxn&*',#密码 port=6379, #端口 ...

  4. PHP中mysql_fetch_row()、mysql_fetch_assoc()和mysql_fetch_array()的联系

    总是记不住或者混淆mysql_fetch_row().mysql_fetch_assoc()和mysql_fetch_array()这三个函数的朋友们注意了,今天我在这里给大家总结一下他们之间的关系, ...

  5. X明X源面试题《二》

    一.解释5种访问修饰符答:public-访问不受限制.private-访问范围为它所属的类.protected-访问范围为它所属的类或从该类派生的类.internal-访问范围为当前程序集.prote ...

  6. jqgrid动态添加rowlist

    function changePager(){     var pagerCenter =$('#grid-pager_center');//获取td     pagerCenter.find('se ...

  7. NoSQL-redis with python

    首先,先去看了一下NoSQL的概念: Wiki中参考的NoSQL终极指南(nosql-database.org)中说: NoSQL DEFINITION: Next Generation Databa ...

  8. 【BZOJ2320】最多重复子串 调和级数+hash

    [BZOJ2320]最多重复子串 Description 一个字符串P的重复数定义为最大的整数R,使得P可以分为R段连续且相同的子串.比方说,“ababab”的重复数为3,“ababa”的重复数为1. ...

  9. 截取字符(pos,copy,Leftstr,MidStr,RightStr)以逗号为准把字符串拆分,判断字符串是否有数字、字母(大小写), 去掉字符串空格

    1.copy(a,b,c) 举个例子: str := “123456”;str1 := Copy(Str,2,3);结果就是 str1 等于 234.Copy有3个参数,第一个是你要处理的字符串,第二 ...

  10. 整理前端css/js/jq常见问题及解决方法(2)

    移动端 手机 1.点击图片或按钮,选中状态影响到其他范围解决:html{-webkit-user-select:none}<meta name="msapplication-tap-h ...