黑马程序员——Java高新技术——反射的复写

由于第一段视频学习效果不理想,希望重新看一遍反射视频,并多方面寻找资料,重新写一遍总结,以期java能力早日提高。

Java——反射

一、Class类

  Class 类的实例表示正在运行的 Java 应用程序中的类和接口。所以,Class可以提供方法获得动态的java类中的各个属性;

(由定义可以知道Class创建的思路就是获得某一个特定java类的信息然后传给Class的对象,那么具体怎么做呢?)

这里说得java类的信息指的就是该java类的计算机的字节码:传给 Class cls1:

所以有三种方向得到

1.从类名得到:类名.class;

2.从具体的对象得到:Person p1=new Person();那么字节码:p1.getClass();

3.Class类它自身的静态方法,能指定得到某个类的字节码:Class.forName("java.Lang.String");

做反射的时候一般用第三种:因为写原程序的时候,我的类可能还没过创建;

注:八种数据类型和void,预定义的类名,直接类名.class就能创建Class。

 1 String strl="abc";
 2         Class cls1=String.class;
 3         Class cls2=strl.getClass();
 4         Class cls3=Class.forName("java.lang.String");//最后这钟有ClassNotFoundException
 5 //        判断三者是否相同,因为多少取同一个类的字节码当然相同啦
 6         System.out.println(cls1==cls2);
 7         System.out.println(cls1==cls3);
 8
 9 //        Class.isPrimitive()方法是判断是否是基本数据类型对应的Class
10         System.out.println(cls1.isPrimitive());//肯定是false
11         System.out.println(int.class.isPrimitive());//肯定是true
12         System.out.println(int.class==Integer.class);//Integer是类啊,大哥
13         System.out.println(int.class==Integer.TYPE);//不过这些保证类提供了一个方法.TYPE返回指定类型
14         System.out.println(int[].class.isPrimitive());//数组当然不是啦
15         System.out.println(int[].class.isArray());//但是Class.isArray可以判断是否数组

二、反射定义与意义:

  反射就是把Java类中的各个成分映射成相应的Java类中(即是Class类),这个Class类提供一系列的方法,来获取其中的变量、方法、构造方法

修饰符、包等信息,这些信息用相应的实例对象来表示,他们就是Field、Method、Contructor、Package等;

  既然一个类中的每个成员都能使用反射的方式来表示,那么怎么得到这些Class类的实例对象,这些实例对象怎么用,用在哪里,就是反射的要点:

三、Constructor(获得构造方法的类)

(1)获得途径:Class类中提供了一个方法:getConstructors()(注意:有s,代表获得这个Class类中所以的构造方法)

  例如:Constructor[] constructor=Class.forName("java.lang.String").getConstructors;

        getConstructor(参数)得到某个参数对应的特点的构造方法:

  例如:

(2)可以调用Class类中getConstructor(String.class,int.class)方法获取指定的构造函数,

    在使用newInstance(”zahns“,23)来获取具体的对象;

1 //        关于Constructor类,关于new String(new StirngBuilffer("abc"))
2         Constructor constructor1=String.class.getConstructor(StringBuffer.class);//得到这个特定参数对应的构造方法
3         String str=
4             (String) constructor1.newInstance(new StringBuffer("abc"));
5         //和new String(new StirngBuilffer("abc"))一个意思了,注意强转
6         System.out.println(str.charAt(2));//答案是c

(我的理解:getConstructor和newInstance这连个步骤分别可以说是声明传入特定类型的,然后就是具体传入什么类型的)

(3)Class.newInstance()方法:

  String obj=(String)Class.forName("java..lang.String").newsInstance();

  该方法内部先得到默认的构造方法,然后用构造方法创建对象;

Class类中的newinstance()方法是使用无参的构造函数创建对象,如果一个类没有参的构造函数,就不能这样创建了。

四、Field类(字段,变量) 

  *CLass.getFidle("变量名")方法可以获得类中指定的字段,然后用Field中get(类名对象)获得实际值;

  *而如果字段是私有的时候使用暴力反射,用人getDeclaredField("变量名")获取,通过get(obj,"")

ReflecPoint 是自定义的类,x私有,y公用

1     ReflecPoint pt1=new ReflecPoint(3,5);
2         Field fielY=pt1.getClass().getField("y");
3 //        这样依然不能获得y的值
4         System.out.println(fielY.get(pt1));//为5
5 //            那么私有的需要使用暴力反射
6         Field fielX=pt1.getClass().getDeclaredField("x");
7         fielX.setAccessible(true);//这部是必须的
8         System.out.println(fielX.get(pt1));//为3
 1 public class ReflecPoint {
 2     private int x;
 3     public int y;
 4
 5     String pp1="asfsdfsdg";
 6     String pp2="asfsasddg";
 7     String pp3="asfsdfaddg";
 8     public ReflecPoint(int x, int y) {
 9 //        super();默认的
10         this.x = x;
11         this.y = y;
12     }
13     public String toString(){
14         return pp1+":"+pp2+":"+pp3;
15     }
16 }
 1         ReflecPoint pt1=new ReflecPoint(3,5);
 2         changeStringValue(pt1);
 3         System.out.println(pt1);
 4     }
 5 //将变量中的String中的b改成a
 6     private static void changeStringValue(Object obj) throws Exception {
 7         Field[] fields=obj.getClass().getFields();
 8         for(Field field : fields){
 9             if(field.getType()==String.class){//比较的是字节码是否相同
10                 String old=(String)field.get(obj);
11                 String news=old.replace(‘b‘, ‘a‘);
12                 field.set(obj, news);
13             }
14     }

五、Method类

时间: 2024-10-24 21:09:50

黑马程序员——Java高新技术——反射的复写的相关文章

黑马程序员——Java高新技术——反射机制

点击打开链接 点击打开链接 点击打开链接 android培训.<a">点击打开链接 点击打开链接 java培训.期待与您交流!">点击打开链接 点击打开链接 反射的基石--Class类 Java程序中的各个java类属于同一类事物,描述这类事物的java类名就是Class. Class类没有构造函数,不能new对象.怎么得到Class类的实例,有3中方法: ①类名.Class    Class  c1=Date.class; ②对象.getClass 获取对象所属的字

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

----------android培训.java培训.java学习型技术博客.期待与您交流!------------ 一.对于反射的概念 对于JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. JAVA反射(放射)机制:"程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言".从这个观点看,Perl,Python,Ruby

黑马程序员——Java高新技术代理

代理 普通代理 很多时候,我们使用别人代码往往会发现别人代码的功能并不是十分符合我们的需求,调用别人的方法的时候,总是先new一个对象,然后我们的前处理做完,然后调用别人代码的方法,再加入后处理,这样做往往十分麻烦.代理就为其他类提供了一种控制其对象的方法.代理类和委托类必须实现同一个接口,这样代理类才能在需要的时候代替委托类对象,执行委托类的方法. interface Solution{ public void doSomething(); } //委托类Demo实现了接口 class Dem

黑马程序员——java基础——反射

 黑马程序员--java基础--反射 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 反射 其实就是动态加载一个指定的类,并获取该类中的所有的内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员. 反射就是把Java类中的各种成分映射成相应的java类. 简单说:反射技术可以对一个类进行解剖. 反射的基石-->Class类 1.java中的类是用来描述一类事物的共性,该类事物有什么属性,没有什么属性

黑马程序员——java高新技术(新特性、反射、泛型)

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- java高新技术 第一部分——JDK1.5新特性 1.增强for循环 格式: for(元素类型 变量名 : Collection集合 & 数组 ) { }//增强for循环括号里写两个参数,第一个是声明一个变量,第二个就是需要迭代的容器 高级for循环和传统for循环的区别: 高级for循环在使用时,必须要明确被遍历的目标.这个目标,可以是Collection集合或者数组,如果遍历Collec

黑马程序员----Java高新技术之反射学习总结

------- android培训.java培训.期待与您交流! ---------- 反射的概念. 1.Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 精妙的总结就是:反射就是将Java类中的各个成分映射成相应的Java类. 3.在Java中,描述事物的各种类同样也是一种事物,也可以用面向对象的方法来描述,即也有一个类来描述众多的J

黑马程序员----java基础--反射机制

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.反射的基本描述 Java反射机制是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象方法的功能称为java语言的反射机制.动态获取类中信息,就是java反射.可以理解为对类的解剖.如果想要对指定名称的字节码文件进行加载并获取其中的内容并调用,这时就使用到了反射技术. 简单一

黑马程序员——JAVA基础-反射

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 反射是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法:对于任意一个对象,都只能都调用它的任意一个 方法和属性,这种动态获取的信息一级动态调用对象的方法的功能呢个称为java 的反射机制. 反射其实就是动态加载一个指定的类,并获取该类中的所有的内容.而且将字节码文件封装成对象, 并将字节码文件中的内容都封装成对象,这样便于操作这些成员.就是把JAVA类中的各种成

黑马程序员-java基础-反射基础

------- android培训.java培训.期待与您交流! ---------- java的反射机制是java的特性之一,反射机制是构建框架技术的基础所在,使用反射可以使程序更加灵活,避免将程序写死在代码里.相对于很多初学者只接触过java基础的人,反射还是一个很朦胧难懂的概念,下面我们就来说一下反射的一些应用. java反射机制是指在运行状态中,动态获取信息以及动态调用对象方法的功能.java反射有3个动态性质:1.运行时生成对象实例,2.运行期间调用发放,3.运行时更改属性. 那么反射