黑马程序员---Java反射机制学习

由现在这个时间补上反射机制的学习笔记,本想报20期的JavaEE班,无奈真担心自己过不去,所以这段时间,一直的复习现在改报21期的吧!!

准备知识:一

1、Java的反射机制的实现要借助于4个类:class,Constructor,Field,Method;
    其中class代表的时类对象,
    Constructor-类的构造器对象,
    Field-类的属性对象,
    Method-类的方法对象。

2、在Java中,每个class都有一个相应的Class对象。也就是说,当我们编写一个类,编译完成后,在生成的.class文件中,就会产生一个Class对象,

用于表示这个类的类型信息。Class类是反射的根源。
1.获取Class对象
得到Class类对象有三种方式
1.使用Object类中的getClass()方法
2.类.class
3.通过Class类的forName方法

自定义Person类

1.public class Person{
2.
3.    public String name;
4.
5.    public  int age;
6.
7.    public Person()
8.    {
9.
10.    }
11.    public Person(String name,int age)
12.    {
13.        this.name=name;
14.        this.age=age;
15.    }
16.
17.
18.    @Override
19.    public String toString() {
20.        return "Person [name=" + name + ", age=" + age + "]";
21.    }
22.
23.}  

获取Person类的Class

1.public static void main(String[] args) {
2.        Person temp1=new Person("小明",20);
3.        Person temp2=new Person("小明",20);
4.        //Object的getClass获取Class
5.        Class class1=temp1.getClass();
6.        Class class2=temp2.getClass();
7.        System.out.println(class1==class2);
8.        //类.class获取Class
9.        Class class3=Person.class;
10.        System.out.println(class1==class3);
11.        //调用forName方法
12.        try {
13.            Class class4=Class.forName("Myclass.Person");//包名
14.            System.out.println(class1==class4);
15.        } catch (ClassNotFoundException e) {
16.            e.printStackTrace();
17.        }
18.
19.    }  

运行结果:

true

ture

true

可以看出得到的Class都是同一个对象,每一个类的Class在类加载时只加载一份,相同类型对象得到的Class是同一份

2.通过Class实例对象

调用无参构造函数,需要Person有无参构造函数

来,得到的Class都是同一个对象,每一个类的Class在类加载时只加载一份,相同类型对象得到的Class是同一份

1.public static void main(String[] args) {
2.        //调用forName方法
3.        try {
4.            Class class4=Class.forName("Myclass.Person");//包名
5.            //需要有无参构造函数
6.            Person temp=(Person)class4.newInstance();//返回Object,需要强制转换
7.            System.out.println(temp.age);
8.        } catch (ClassNotFoundException e) {
9.            e.printStackTrace();
10.        } catch (InstantiationException e) {
11.            e.printStackTrace();
12.        } catch (IllegalAccessException e) {
13.            e.printStackTrace();
14.        }
15.
16.    }  

调用有参构造函数

1.public static void main(String[] args) {
2.        //调用forName方法
3.        try {
4.            Class class4=Class.forName("Myclass.Person");//包名
5.            //获取指定分构造函数
6.            Constructor ok=class4.getConstructor(String.class,int.class);
7.            //实例化对象
8.            Person temp=(Person)ok.newInstance("小黑",35);//强制转换
9.            System.out.println(temp);
10.        } catch (Exception e) {
11.            e.printStackTrace();
12.        }
13.    }  

3.Class类信息获取
获取包名和类名

1.public static void main(String[] args) {
2.        //调用forName方法
3.        try {
4.            Class class4=Class.forName("Myclass.Person");//包名
5.
6.            System.out.println("类名为: " +class4.getName());
7.            System.out.println("包名为: " +class4.getPackage());
8.        } catch (Exception e) {
9.            e.printStackTrace();
10.        }
11.    }  

获取类中的方--->getMethods()方法:只能获取该类和以及该类继承的类和实现接口的public方法。(默认继承Object类)法

1.public static void main(String[] args) {
2.        //调用forName方法
3.        try {
4.            Class class4=Class.forName("Myclass.Person");//包名
5.
6.            Method[]methods=class4.getMethods();
7.            for(int i=0;i<methods.length;i++)
8.                System.out.println("方法名为: "+methods[i].getName());
9.        } catch (Exception e) {
10.            e.printStackTrace();
11.        }
12.    }  

获取类中的属性

1.getFields()方法:获取该类的公有属性

2.getDeclaredFields()方法:获取该类的全部属性

1.public static void main(String[] args) {
2.        //调用forName方法
3.        try {
4.            Class class4=Class.forName("Myclass.Person");//包名
5.            //该类的公有属性
6.            Field[]fields=class4.getFields();
7.            for(int i=0;i<fields.length;i++)
8.                System.out.println(fields[i].getName());
9.            //获取该类的全部属性
10.            Field[]fields1=class4.getDeclaredFields();
11.            for(int i=0;i<fields1.length;i++)
12.                System.out.println(fields1[i].getName());
13.        } catch (Exception e) {
14.            e.printStackTrace();
15.        }
16.    }  

4.Class类调用方法和属性
为自定义的Person增加私有属性和私有方法,修改Person为:

1.public class Person {
2.
3.    public String name;
4.
5.    public  int age;
6.
7.    private String  sex;
8.
9.    public Person()
10.    {
11.
12.    }
13.    public Person(String name,int age,String sex)
14.    {
15.        this.name=name;
16.        this.age=age;
17.        this.sex=sex;
18.    }
19.
20.
21.    @Override
22.    public String toString() {
23.        return "Person [name=" + name + ", age=" + age + "]";
24.    }
25.
26.    public void sayHello(String word){
27.        System.out.println("Hello "+word);
28.    }
29.
30.    private void OutSex()
31.    {
32.        System.out.println("性别为:"+this.sex);
33.    }
34.
35.}  

调用类的方法 ,方法是属于对象的,所有调用类中的方法时,需要实例化一个对象

1.public static void main(String[] args) {
2.        //调用forName方法
3.        try {
4.            Class class4=Class.forName("Myclass.Person");//包名
5.            //实例化对象
6.            Constructor  cs=class4.getConstructor(String.class,int.class,String.class);
7.            //调用公有方法sayHello方法-----------------------------
8.            //方式1:
9.            Person ok=(Person)cs.newInstance("小黑",20,"女");
10.            ok.sayHello(" world!");
11.            //方式2:
12.            //获取sayHello方法
13.            Method method=class4.getMethod("sayHello",String.class);//方法名,参数
14.            method.invoke(ok, "世界!");
15.            //调用Person私有方法OutSex方法-------------------------
16.            //获取OutSex方法
17.            Method method1=class4.getDeclaredMethod("OutSex");//方法名,无参数
18.            method1.setAccessible(true);//允许调用私有方法
19.            method1.invoke(ok);//无参数
20.        } catch (Exception e) {
21.            e.printStackTrace();
22.        }
23.    } 

调用类的属性

1.public static void main(String[] args) {
2.        //调用forName方法
3.        try {
4.            Class class4=Class.forName("Myclass.Person");//包名
5.            //实例化对象
6.            Constructor  cs=class4.getConstructor(String.class,int.class,String.class);
7.            //调用公有属性-----------------------------
8.            //方式1:
9.            Person ok=(Person)cs.newInstance("小黑",20,"女");
10.            System.out.println(ok.name);
11.            //方式2:
12.            Field field=class4.getField("name");
13.            field.set(ok, "王继强");
14.            System.out.println(field.get(ok));
15.            //调用私有属性-------------------------
16.            Field field2=class4.getDeclaredField("sex");
17.            field2.setAccessible(true);//允许访问
18.            field2.set(ok, "非男非女");
19.            System.out.println(field2.get(ok));
20.        } catch (Exception e) {
21.            e.printStackTrace();
22.        }
23.    }
时间: 2024-12-28 05:17:36

黑马程序员---Java反射机制学习的相关文章

黑马程序员---java反射机制的实现原理

------- android培训.java培训.期待与您交流! ---------- 反射机制就是java语言在运行时拥有一项自观的能力. 通过这种能力可以彻底的了解自身的情况为下一步的动作做准备. 下面具体介绍一下java的反射机制.这里你将颠覆原来对java的理解. Java的反射机制的实现要借助于4个类:class,Constructor,Field,Method: 其中class代表的时类对象, Constructor-类的构造器对象, Field-类的属性对象, Method-类的方

黑马程序员_Java反射机制

一切的操作都将使用Object完成,类,数组的引用都可以使用Object来接收 1,认识Class类 以前要是想知道一个类中的属性,成员变量,方法等等的信息的话,需要通过new这个类的对象才能得到这些信息,但是在Java中,也允许一个实例化对象找到一个类的完整的信息,这个类就是Class类,Class类是继承Object类的. 正常方式:  引入需要的"包.类"名称 >取得实例化对象 反射方式:  实例化对象>得到完整的"包.类"名称 getClass(

黑马程序员------Java反射学习总结(一)

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

黑马程序员-Java 反射

--Java培训.Android培训.iOS培训..Net培训.期待与您交流!-- 一.概述 Java 反射机制是在运行状态中,对于程序中的任意一个类,通过反射机制都能够知道这个类的所有属性和方法,包括共有.包含.默认和私有.对于任意的一个对象,通过反射机制都可以去调用它的每一个方法,这种机制就称为Java的反射机制.一般的操作都在java.lang.reflect包中,常用到的类有Constructor,Field和Method三种.既然是对Java类的反射,当然也有个比不可少的类Class,

黑马程序员___java反射机制

 ----------- android培训.java培训.java学习型技术博客.期待与您交流! --------- Java的反射机制的实现要借助于4个类:class,Constructor,Field,Method:其中class代表的时类对 象,Constructor-类的构造器对象,Field-类的属性对象,Method-类的方法对象.通过这四个对象我们可以粗略的看到一个类的各个组 成部分.Class:程序运行时,java运行时系统会对所有的对象进行运行时类型的处理.这项信息记录了每个

黑马程序员-Java面向对象编程学习总结

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- Java面向对象编程学习总结: 重要知识点总结如下: 1,抽象,封装,继承,多态是面向对象程序设计中得四个特点. 2,面向对象得软件开发大体分为:面向对象的分析,面向对象的设计,面向对象的实现. 可概括为如下过程:分析用户需求,从问题中抽

黑马程序员------Java反射学习总结(二)

----------------------------Java培训.Android培训.期待与您交流! ------------------------------- ArrayList_HashSet的比较及Hashcode分析 看以下三段代码: 1.定义一个点类(Point) 1 package com.itheima.day1; 2 3 public class ReflectPoint { 4 private int x; 5 public int y; 6 7 public Refl

黑马程序员——JAVA集合框架学习总结

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- www.itheima.com 要学好java的集合框架,必须掌握此图: Java集合框架很全面,从大的来说.它包括两种类型: 1.一种是以collection为根接口的集合. 2.另一种是由map为根接口的<key,value>的“图”. 而collection之下的set接口和list接口又有不同: 1.Set 接口继承 Collection,但不允许重复,使用自己内部的一个排列机制.

黑马程序员------Java网络编程学习总结

Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! 网络模型: OSI参考模型 TCP/IP参考模型 网络参考模型图 网络通讯的要素: IP地址:InetAddress 网络中设备的标识 不容易记忆,可以用主机名 本地回环地址:127.0.0.1:主机名:localhost 端口号 用于标识进程的逻辑地址,不同进程的标识 有效端口:0~65535,其中0~1024为系统使用端口或保留端口 网络协议  是一种网络通讯的规则  常见协议:TCP,UDP UDP: 1