黑马程序员_反射

 

反射

1、由来:

  程序后期扩展,无源码修改的扩展

2、java.lang.Class  描述.class的类

  java.lang.reflect.Constructor  描述构造方法的类

  java.lang.reflect.Field  描述成员变量的类

  java.lang.reflect.Method  描述成员方法的类

3、实现反射:

  A、获取class文件对象    

    第一种:通过对象获取

      Person p=new Person();

      Object中getClass(),返回值是Class类型

    第二种:

      通过类的静态属性class获取

    第三种:通过class类的静态方法forName获取

      class.forName("包名.Person");//要写全类名

  B、获取构造方法

    Class类中Constructor[] getConstructors() 获取class文件中公共权限的构造方法,

    Class类中ConStructor getConstructor(class...c)获取公共权限的指定参数列表的构造函数。如果获取没有可变参数的可以不写参数列表。

    Class类中Constructor[] getDeclaredConstructors() 获取全部构造函数

    Class类中ConStructor getDeclaredConstructor(Class...c)可以单独获取私有的构造方法

    

    运行构造方法:

      Constructor类中Object newInstance(Object...o)

      Constructor类的父类Accessible类中setAccessible(boolean 0)传递的若是true,运行期间则取消JVM的访问检查,即可运行私有构造函数。

      Class类中 Object newInstance()可以直接获取public修饰的空参数的构造方法并运行。前提必须保证存在这样的方法。

  C、获取普通方法:

    Class类中Method[] getMathods() 返回字节码文件中的方法,这些方法是public修饰的,包括继承的和实现的方法。        

    Class类中Method getMethod(String 方法名,Class...c)返回一个方法,传递方法名和参数列表

    Class类中getDeclareMethod(String 方法名,Class...c)可以获取私有的构造方法

    运行普通方法:

    Method类中Object invoke(Object o对象,Object...args方法中的参数)

4、运用反射实现泛型的临时擦除

 1 import java.util.*;
 2 import java.lang.reflect.*;
 3 public class ListDemo {
 4     public static void main(String[] args) throws Exception{
 5
 6         ArrayList<String> array = new ArrayList<String>();
 7         array.add("asdf");
 8         array.add("dgfer");
 9         //获取ArrayList类的字节码文件对象
10         Class clazz = array.getClass();
11         //获取添加方法add
12         Method method = clazz.getMethod("add", Object.class);
13         method.invoke(array, 123);
14         method.invoke(array, 12.34);
15         method.invoke(array, true);
16         System.out.println(array);
17         Iterator it = array.iterator();
18         while(it.hasNext()){
19             System.out.println(it.next());
20         }
21     }
22 }
时间: 2024-12-21 15:17:39

黑马程序员_反射的相关文章

黑马程序员_反射(一)

/*1.反射:反射处理的对象是内存中的java类,即一个类的字节码对象.  该字节码对象是这个类在内存中的代表.            一个类是否加载到内存中来,就看内存中是否有这个类的字节码.           该字节码对象是用来创建其代表的类的实例对象的.           这个字节码对象也是用一个java类来描述的,叫做Class类,即Class类是用来描述java类的,java类这            一类事物有“类名”,“构造方法”,“方法列表”,“字段列表”,“访问权限”,“父

黑马程序员_高新技术_1_Java反射

------- android培训.java培训.期待与您交流! ---------- 0.反射知识体系 下图为反射整体的知识体系,把握住此图也就全局上掌握住反射所有内容. 1.反射概论 1)反射概念 其实字面上可以这么理解反射,平时使用类时都是由类new出对象,而反射则是通过对象"反射"出类的信息,好比一个人照镜子可以看到人类的特征,而看出机制就是镜子反射. 2)Java对象两种类型 Java程序中的许多对象在运行时会出现两种类型:编译时类型和运行时类型.如下代码: Person p

黑马程序员_类加载机制

------- android培训.java培训.期待与您交流! ---------- 0.类加载机制知识体系 1.类与JVM进程 使用Java命令运行某个Java程序时,此命令会启动一个Java虚拟机进程,不管Java程序多复杂,开启了多少个线程,这个线程都运行在Java虚拟机进程里.同一个JVM的所有线程.所有变量都处于同一个进程里,都使用该JVM进程的内存区. 只有出现下列情况时,JVM进程才会终止: 1)程序正常结束. 2)程序执行到代码System.exit()或Runtime.get

黑马程序员_集合

集合1.集合和对象数组的区别: 数组的长度不可变,集合的可变: 数组可以存储基本数据类型和对象,集合只能存储对象. 集合的框架图 集合派系的顶层接口Collection1.Collection集合存储对象的方法: add(E e)将元素存储到集合中 addAll(Collection c)将一个集合添加到另外的集合中2.Collection集合提取对象的方法: 通过迭代器iterator中的方法:hasNext()和next()来取出 Iterator it=new iterator(); wh

黑马程序员_学习IOS之字典常用的方法

字典是无序的 数组是有序的.字典分为:可变字典和不可变字典  不可变字典对象 NSDictionary * dict = [[NSDictionary alloc]initWithObjectsAndKeys:@"one",@"1",@"two",@"2",@"three",@"3",@"four",@"4", nil]; //value = ke

黑马程序员_多线程

------- android培训.java培训.期待与您交流! ---------- 多线程1.进程: 正在运行的程序所占有的内存空间,叫做进程. 线程: 一个应用程序中的子程序,对于CPU,子程序可以有一条独立的执行路径,称为线程. 线程特点:依靠一个应用程序,对于其他子程序,独立被CPU执行的2.多线程的好处: 充分利用CPU的资源,程序的同时运行,提高效率3.java中线程创建的两种方法: 第一种: 定义类继承Thread class extends Thread 重写Thread中的r

黑马程序员_交通灯管理系统

(1)项目的需求 模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 例如: 由南向而来去往北向的车辆 右转车辆 由东向而来去往南向的车辆 ---- 左转车辆 平时开车过十字路口红绿灯的时候,也知道红绿灯运行的顺序 (1)任何方向的车,向右边转弯的时候,是不需要看红绿灯 (2)在十字路口,相对方向的红绿灯的工作方式是一样的,南相对与北,东相对与西,这把它分成两对 (3)红绿灯顺序,一对直行通道绿灯直行车辆,等直行变红,还是这对的车辆可以左转,等左转变红,就轮到下一对了.所以在设计程序的时候,只

黑马程序员_ 利用oc的协议实现代理模式

先说下代理模式是什么吧 定义: 为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象 而代理对象可以在客户端和目标对象之间起到中介的作用. 在看过李明杰老师的课程后,我对代理模式有了最初步的理解,虽然还很浅显 但是也明白了代理模式的 一些作用跟用法.首先使用代理模式可以降低耦合度.大大的增强了代码的弹性. 举个例子,小明想看电影,但是没时间买票 于是就拜托小强去买票 最简单的方式就是 建立一个person类(小明) 一个agent类(代理类) ag

黑马程序员——高新技术---反射

黑马程序员——高新技术---反射 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ 一.概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 反射把Java类中的各种成分映射成相应的Java类,例如一个Java类中用一个Class类的对象表示,一个类中的组成部分:成员变量,方法,构造方