java中除了基本数据类型,几乎都为对象。例如

Person p=new Person(); 这句语句表明了p是Person类的一个实例对象。但其实,Person也是一个实例对象,它是Class类的实例对象(java.lang.Class)。

Person的实例对象是通过new来获取的,但是Class的实例对象我们却不能这样new出来,因为通过源码我们会发现Class的构造方法是已经私有化了。

如果我们要获取Class的实例对象(即官方中的类类型,后文将用以区分普通的实例对象),有三种方式。

1.通过类.class来获取

package reflect;

public class Demo1 {
public static void main(String[] args) {
Person person = new Person();
Class p=Person.class;
}
} class Person{ }

2.通过对象的getClass方法来获取

package reflect;

public class Demo1 {
public static void main(String[] args) {
Person person = new Person();
Class p=person.getClass();
}
} class Person{ }

3.通过动态加载(后文有作解释何为动态加载)

package reflect;

public class Demo1 {
public static void main(String[] args) {
try {
Class p=Class.forName("reflect.Person");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} class Person{ }

总共三种方式可以获取Class的实例对象p,这个p就称之为Person的类类型。

动态加载和静态加载:

普通的利用构建方法new的方式称之为静态加载,而通过Class.forName(String name)的方法找到其类类型,再new Instance方式创建其对象的

方式称之为动态加载。

区别:静态加载时发生在编译时,就是编译过程中会去创建对象,如果发现问题会报错。而动态加载则是在运行过程中才会去加载,并才会去发现错误。

好处就是,动态加载能够在不改变原有的情况下,增加新的功能。

例如:

静态加载:

package reflect;

/**
* 静态加载
* @author Administrator
*
*/
public class Demo2 {
public static void main(String[] args) throws Exception {
Person1 p=new Person1(); //报错 编译报错 }
}

动态加载:

package reflect;

/**
* 动态加载
* @author Administrator
*
*/
public class Demo2 {
public static void main(String[] args) throws Exception {
Class clazz=Class.forName("reflect.Person");
Object obj=clazz.newInstance(); }
}

类类型--反射:

通过类类型我们可以获取到该类几乎所有的信息,包括成员方法以及成员变量。

大部分的方法都可以通过api或者ide工具了解并使用。需要注意的是method的反射。(getDeclaredMethod()和getMethod()  前者或者本类声明的函数,不管方法访问权限。而getMethod获取的是public的,包括父类集成或者接口继承的方法)

package reflect;

import java.lang.reflect.Method;

/**
* 方法的反射
* @author Administrator
*
*/
public class Demo2 {
public static void main(String[] args) throws Exception {
Class n=Class.forName("reflect.NumUtil");
Object obj = n.newInstance();
Method method = n.getDeclaredMethod("testAdd", int.class,int.class);
method.invoke(obj, 1,2);
}
} class NumUtil{ void testAdd(int a,int b){ System.out.println("testadd的方法:"+(a+b)); } }

Java反射机制简单学习的更多相关文章

  1. Java反射机制的学习

    Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调 ...

  2. java反射机制简单实例

    目录 Java反射 简单实例 @(目录) Java反射 Java语言允许通过程序化的方式间接对Class进行操作.Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通 ...

  3. Java反射机制 —— 简单了解

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

  4. Java反射机制集中学习

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

  5. Java反射机制简单使用

    1.Java反射相关类所在package: java.lang.reflect.* 2.开始使用Reflection: 使用reflect相关类,遵循三个步骤: a.获取想要操作类的 java.lan ...

  6. java反射机制简单介绍

    1.字节码.所谓的字节码就是当java虚拟机载入某个类的对象时,首先须要将硬盘中该类的源码编译成class文件的二进制代码(字节码),然后将class文件的字节码载入到内存中,之后再创建该类的对象 2 ...

  7. java反射机制-简单实例

    public class Car { private String brand; private String color; private int maxSpeed; public Car() { ...

  8. JAVA反射机制—学习总结

    最近收到很多关于Java反射机制的问题留言,其实Java反射机制技术方面没有太多难点,或许是大家在学习过程中遗漏了细小知识点,导致一些问题无法彻底理解,现在我们简单的总结一下,加深印象.什么是反射机制 ...

  9. Java反射机制——学习总结

    前几天上REST课,因为涉及到Java的反射机制,之前看过一直没有用过,有些遗忘了,周末找了些资料来重新学习,现在总结一下,加深印象. 什么是反射机制? 参考百度百科对java反射机制的定义: “JA ...

随机推荐

  1. 某考试 T1 monopoly

    可以很容易的发现,如果选了最高的房子,那么就不能再选了:否则在左边选一坨合法的,在右边选一坨合法的,拼起来还是合法的. 所以我们可以处理出,每个数的控制区间[L,R] (保证这个区间是其他数都小于它的 ...

  2. [CF665F]Four Divisors

    题目大意: 给定$n(n\leq10^{11})$,求$\displaystyle\sum_{i=1}^n[\tau(i)=4]$. 思路: 设$p,q$为不相等的质数,则满足$\tau(i)=4$的 ...

  3. vue开发小程序简介

    开发环境搭建 nodejs 安装最新版的nodejs,同时安装cnpm包管理器 jdk1.8 apache-maven3.3.9 Intellij Idea2018 [后端开发工具] vscode[前 ...

  4. UVA 10827 Maximum sum on a torus 最大矩阵和

    题目链接:UVA - 10827 题意描述:给出一个n*n矩阵,把第一行和最后一行粘一起,把第一列和最后一列粘一起,形成一个环面,求出这个环面中最大的矩阵和. 算法分析:首先复制n*n这个矩阵,形成由 ...

  5. eclipse 国际化 $NON-NLS-1$ 含义

    一.$NON-NLS-1$ 含义 Eclipse 如果每行代码里有这个字符串:$NON-NLS-1$ 表示:这一行的第一个字符串是不需要国际化的.同理$NON-NLS-2$,$NON-NLS-3$.. ...

  6. HTTP协议header头域

    HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送WWW方式的数据,关于HTTP协议的详细内 容请参考RFC2616.HTTP协议采用了请求/响应模型.客 ...

  7. Android中的多线程断点续传

    Android多线程断点下载的代码流程解析: 运行效果图: 实现流程全解析: Step 1:创建一个用来记录线程下载信息的表 创建数据库表,于是乎我们创建一个数据库的管理器类,继承SQLiteOpen ...

  8. Centos下添加用户组

    近日,重新整理了下开发环境,重装了,nginx,但是这个时候却是报错了,报错信息如下: [root@hserver1 php-7.0.5]# nginx -t nginx: [emerg] getpw ...

  9. recovery怎么刷机,recovery是什么意思

    转自:http://www.3lian.com/edu/2012/04-11/25212.html Recovery是什么意思? recovery翻译过来就是“恢复”的意思,是开机后通过特殊按键组合( ...

  10. 最长递增子序列问题—LIS

    问题:给定一组数 a0,a0,....,an-1. 求该序列的最长递增(递减)序列的长度. 最长递增子序列长度的求法有O(n^2)和O(nlogn)两种算法. 1.复杂度为O(n^2)的算法. 设L[ ...