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. 有关于iOS字体的设置

    1.网上搜索字体文件(后缀名为.ttf,或.odf) 2.把字体库导入到工程的resouce中 3.在程序viewdidload中加载一下一段代码 NSArray *familyNames = [UI ...

  2. Android开发:《Gradle Recipes for Android》阅读笔记1.6——使用android studio添加依赖

    有经验的gradle开发者习惯直接编辑build.gradle文件,但是IDE没有提供许多代码提示.IDE提供了一个可视的界面显示配置内容. 点击像文件夹一样的图标可以看到project struct ...

  3. selenium的元素定位-iframe

    # name = top-frame # 如果iframe有name属性 或 id属性则 可以直接在frame种填写 # 如果没有name和id属性 frame() 可以接受elementOBj el ...

  4. PHP+MySQL:测试连接+基本DB操作

    PHP使用MySQL,从连接.创建.到结果显示 <?php //连接MySQL测试 $db = mysql_connect("localhost","root&qu ...

  5. PowerDesigner之设置(1)

    这里用到的数据库为SQL2000. PowerDesigner 16. 原始格式: (个人认为的缺点) 创建表前先将原来的表删除(创建表逻辑,假如存在则drop.假如原来有数据,用drop就有问题.新 ...

  6. Highway

    Highway Accepted : 78   Submit : 275 Time Limit : 4000 MS   Memory Limit : 65536 KB Highway In ICPCC ...

  7. IOS开发复习笔记(1)-OC基础知识

    在上班之余学习IOS已经有三个多月了,因为基础有些薄弱从OC的基本语法开始学习的,相继看了青柚子和红柚子的书,现在在看编程实战,趁这个机会好好的总结一下: 1.命名约定 对象类型和名称一致,以免混淆 ...

  8. PHP 获得域控内用户的计算机登录名

    一个需求: 在域控范围获得访问用户的计算机名.方法: 1.测试软件环境: XAMPP Control Panel V3.2.1 ,  Apache version 2.4.7 2.Apache 2.2 ...

  9. 练习: 省市联动(Ajax)

    // 示例一: china.xml (位于 src 目录下) <?xml version="1.0" encoding="utf-8"?> < ...

  10. Nuxt使用高德地图

    事先准备 注册账号并申请Key 1. 首先,注册开发者账号,成为高德开放平台开发者 2. 登陆之后,在进入「应用管理」 页面「创建新应用」 3. 为应用添加 Key,「服务平台」一项请选择「 Web ...