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

反射机制中的类:
java.lang.Class;
java.lang.reflect.Constructor; java.lang.reflect.Field;
java.lang.reflect.Method;
java.lang.reflect.Modifier;

反射机制获取类:

//第一种方式:最灵活最具扩展性
Class demo = Class.forName("Demo");

//第二种方式:
//java中每个类型都有一个静态class属性来获取其对应的Class对象
Class demo = Demo.class;

//第三种方式:
//java语言中任何一个java对象都有getClass 方法
Demo d= new Demo();
Class demo = d.getClass();

  创建对象: newInstance();
Class demo =Class.forName("Demo");
//调用了Demo的无参数构造方法,如果没有无参构造方法,可以使用getDeclaredMethod获取构造方法创建对象
//创建此Class 对象所表示的类的一个新实例
Object o = demo.newInstance();

获取属性:分为所有的属性和指定的属性
  获取所有的属性的写法:

 public void getFields() throws ClassNotFoundException
{
//获取整个类
Class c = Class.forName("java.lang.Long");
//获取所有的属性,包括本类中的私有属性
Field[] fs = c.getDeclaredFields();
StringBuffer sb = new StringBuffer();
//获取类的修饰符和类名
sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() + "{\n");
for (Field field : fs)
{
sb.append("\t");//制表符
//获得属性的修饰符
sb.append(Modifier.toString(field.getModifiers()) + " ");
//属性的类型的名字
sb.append(field.getType().getSimpleName() + " ");
//属性的名字+回车
sb.append(field.getName() + ";\n");
}
sb.append("}");
System.out.println(sb);
}

  获取特定的属性:

 public void getField(String className, String fieldName, String value) throws Exception
{
//获取className类
Class c = Class.forName(className);
//获取fieldName属性
Field field = c.getDeclaredField(fieldName);
//实例化这个类赋
Object o = c.newInstance();
//打破封装,使用反射机制可以打破封装性,导致了java对象的属性不安全。
field.setAccessible(true);
//给o对象的fieldName属性赋值set
field.set(o, value);
//get
System.out.println(field.get(o));
}

方法关键字                             含义

getMethods()                            类或接口(包括超类和超接口继承的那些的类或接口)的公共方法
getMethod(String name, Class<?>... parameterTypes)         类或接口的指定公共成员方法
getDeclaredMethods()                        获取所有方法,包括私有方法,但不包括继承的方法
getReturnType()                          获得方法的放回类型
getParameterTypes()                          获得方法的传入参数类型
getDeclaredMethod("方法名",参数类型.class,...)             获得特定的方法

构造方法关键字                            含义
getConstructors()                            获取类的所有公共构造方法
getConstructor(Class<?>... parameterTypes)               获取类的指定公共构造方法
getDeclaredConstructors()                        获取所有的构造方法,包括私有构造方法
getDeclaredConstructor(参数类型.class,...)                获取特定的构造方法,包括私有构造方法

父类和父接口                              含义
getSuperclass()                             获取类的父类
getInterfaces()                            获取类实现的接口

查看Java编译class文件字节码命令: #javap -c filepath.class   --查看class文件字节码

Java基础知识_毕向东_Java基础视频教程笔记(26 反射)的更多相关文章

  1. Java基础知识_毕向东_Java基础视频教程笔记(22-25 GUI 网络编程 正则)

    22天-01-GUIGUI:Graphical User Interface 图形用户接口 Java为GUI提供的对象都存在java.Awt和javax.Swing两个包中CLI:Common lin ...

  2. Java基础知识_毕向东_Java基础视频教程笔记(19-21 IO流)

    18天-06-IO流 字节流和字符流 字节流两个基类:InputStream,FileInputStream,BufferedInputStream OutputStream,FileOutputSt ...

  3. Java基础知识_毕向东_Java基础视频教程笔记(14-18集合框架)

    14天-01-集合框架集合类出现:面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式.数组与集合类同是容器,有何不同? 数组长度 ...

  4. Java基础知识_毕向东_Java基础视频教程笔记(11-12 多线程)

    11天-01-多线程进程:是一个正在执行中的程序.每个进程执行都有一个执行顺序.该顺序是一个执行路径或者叫一个控制单元.线程:是进程中的一个独立的控制单元,线程在控制着进程的执行.一个进程至少有一个线 ...

  5. Java基础知识_毕向东_Java基础视频教程笔记(5-10 面向对象)

    06天-05-面向对象(帮助文档的制作javadoc):java文档生成命令:javadoc -d filepatn demo.java   -author -version(可选)一个类中默认会有一 ...

  6. Java基础知识_毕向东_Java基础视频教程笔记(13 字符)

    13天-01-String String类适用于描述字符串事物. 常见的操作:1.获取: 1.1字符串中包含的字符数,也就是字符串的长度. int length():获取长度 1.2根据索引值获取位置 ...

  7. 黑马程序员_毕向东_Java基础视频教程——java语言组成部分(随笔)

    java语言组成部分 Java是一种强类型语言,所谓强类型语言就是对具体的数据进行不同的定义.对类型的划分的十分细致,对内存中分配了不同大小的内u你空间 关键字 标识符 注释 变量和常量 运算符 语句 ...

  8. 黑马程序员_毕向东_Java基础视频教程——算术运算符小点(随笔)

    算术运算符小点 ​ 取模 class Test{ public static void main(String[] args){ System.out.println( 1 % -5); System ...

  9. 黑马程序员_毕向东_Java基础视频教程——变量(随笔)

    变量 变量 就是将不确定的数据进行存储.也就是需要在内存中开辟一块空间. 内存就是一块运算区域.内存越大.内存中装的数位就越多.运算就越快 ============================== ...

随机推荐

  1. skipper lua 脚本支持

    skipper 对于lua 脚本的支持是通过gopher-lua,支持基本上大部分的lua特性 说明:项目使用docker-compose 运行 环境准备 docker-compose 文件 vers ...

  2. 新建 django 项目

    安装 django ,就不必多说,python 环境是 python 3.6,django 安装的命令为: pip3 install django==2.1.7 开始demo,名字为 guest dj ...

  3. yum 安装 Mysql 5.7,忘记密码解决方案

    Linux卸载yum安装的mysql 一.系统情况 Linux:Centos7.4(64位) Mysql:5.6 二.卸载mysql 1.查看安装了哪些mysql程序 Bash rpm -qa | g ...

  4. 【转】C#获取当前日期时间(转)

    我们可以通过使用DataTime这个类来获取当前的时间.通过调用类中的各种方法我们可以获取不同的时间:如:日期(2008-09-04).时间(12:12:12).日期+时间(2008-09-04 12 ...

  5. tomcat端口号被占用的问题

    错误原因:8080端口被其他的应用占用! 在网上查了下解决方案,有些说在任务管理窗口关闭javaw.exe,有些说shutdown一下tomcat,亲测在某些场合下可用. 下面是摘自其它博客园里文章的 ...

  6. OpenSSL 1.0.0生成p12、jks、crt等格式证书的命令个过程 -参考自http://lavasoft.blog.51cto.com/62575/1104993/

    OpenSSL 1.0.0生成p12.jks.crt等格式证书的命令个过程   此生成的证书可用于浏览器.java.tomcat.c++等.在此备忘!     1.创建根证私钥命令:openssl g ...

  7. 使用Tesseract-OCR 进行文字识别

    关于中文的识别,效果比较好而且开源的应该就是Tesseract-OCR了,所以自己亲身试用一下,分享到博客让有同样兴趣的人少走弯路. 文中所用到的身份证图片资源是百度找的,如有侵权可联系我删除. 一. ...

  8. .net(C#)常见面试题

    1. 简述 private. protected. public. internal 修饰符的访问权限. 答 . private : 私有成员, 在类的内部才可以访问. protected : 保护成 ...

  9. excel技巧--批量生成工资条

    要想生成如上图的工资条,快速的方法如下: 1.在工资表右侧建立一升序数字列,完成后再复制该列,重复粘贴一次在该列底部.2.对该表排序:“开始”-->“排序和筛选”-->自定义排序.在对话框 ...

  10. Django中的URL映射

    1.为什么回去urls.py文件中寻找映射呢? 因为在settings.py中配置了ROOT_URLCONF为urls.py: ROOT_URLCONF = 'first_project.urls' ...