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. 【spring boot logback】spring boot中logback日志乱码问题

    在初次使用logback的自定义配置文件完整的控制spring boot日志后,发现了一个无法忍受的问题,就是日志乱码. 控制台看到打印日志乱码如下: 而日志文件打开: 记事本打开 sublime打开 ...

  2. Android无线测试之—UiAutomator UiSelector API介绍之一

    一. UiSelector类介绍: 1) UiSelector类说明: UiSelector代表一种搜索条件,可以在当前界面上查询和获取特定元素的句柄,当找到多余一个的匹配元素,则返回布局层次结构上第 ...

  3. Android无线测试之—UiAutomator工程建立

    一.环境要求: 已经搭建好了Android UiAotomator测试环境 二.新建测试工程: 1.打开eclipse,首次打开指定一个工作空间 2.新建一个Java Project,名叫:Demo1 ...

  4. 在eclipse里面使用git仓库,并且使用maven加载项目

    前提:安装完成git和maven(maven需要在eclipse中配置完成) 1.点击Windows->show view 选择Git Repositories(git仓库) 2.点击2号图标, ...

  5. hoj 2715 (费用流 拆点)

    http://acm.hit.edu.cn/hoj/problem/view?id=2715 将每个格子 i 拆成两个点 i’, i’’并加边(i’, i’’, 1, -Vi), (i’, i’’, ...

  6. B - Catch That Cow (抓牛)

    B - Catch That Cow Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u ...

  7. Python3.6全栈开发实例[019]

    19.干掉主播.现有如下主播收益信息, 按照要求, 完成相应操作:(1)计算主播平均收益值 sum = 0 for i in zhubo.values(): sum +=i print(round(s ...

  8. [置顶] 我的Android进阶之旅------>Android中制作和查看自定义的Debug版本Android签名证书

    Android应用开发接入各种SDK时会发现,有很多SDK是需要靠package name和的证书指纹SHA1码来识别的,如百度地图SDK.这样如果使用默认自动生成的debug的话就会给开发调试工作带 ...

  9. linux c编程:System V消息队列一

    消息队列可以认为是一个消息链表,System V 消息队列使用消息队列标识符标识.具有足 够特权的任何进程都可以往一个队列放置一个消息,具有足够特权的任何进程都可以从一个给定队列读出一个消息.在某个进 ...

  10. SQL2008 R2直接恢复 mdf后缀数据文件

    数据库默认存储地址为   C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA  ,那么我首先把朋友给的,md ...