java学习之反射

 1 package com.gh.ref;
 2
 3 public class Person {
 4     private String name;
 5     private int age;
 6     private char sex;
 7     private void say(){
 8         System.out.println("我是"+name);
 9     }
10     public String getName() {
11         return name;
12     }
13     public void setName(String name) {
14         this.name = name;
15     }
16     public int getAge() {
17         return age;
18     }
19     public void setAge(int age) {
20         this.age = age;
21     }
22     public char getSex() {
23         return sex;
24     }
25     public void setSex(char sex) {
26         this.sex = sex;
27     }
28     public String toString() {
29         return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]";
30     }
31     public Person(String name, int age, char sex) {
32         super();
33         this.name = name;
34         this.age = age;
35         this.sex = sex;
36         System.out.println("调用Person有参构造方法");
37     }
38     public Person() {
39         super();
40         System.out.println("调用Person无参构造方法");
41     }
42
43 }
 1 package com.gh.ref;
 2 import java.lang.reflect.Constructor;
 3 import java.lang.reflect.Field;
 4 import java.lang.reflect.InvocationTargetException;
 5 import java.lang.reflect.Method;
 6 import java.lang.reflect.Modifier;
 7 /**
 8  * 反射
 9  * @author ganhang
10  */
11 public class RefDemo {
12     public static void main(String[] args) throws Exception {
13         Person p=new Person("小白",18,‘男‘);
14         Person p1=new Person("小黑",10,‘女‘);
15         //创建Class对象方法一
16         Class personClass=p.getClass();
17         Class personClass1=p1.getClass();
18         System.out.println(personClass==personClass1);
19         /**
20          * true是因为java虚拟机先把Person.class通过类加载器加载到内存,加载到内存就是以Class类型存在的
21          * 但是两个对象只加载一次Person,所以他们的内存地址是 一样的;这和instanceof的功能本质一样
22          */
23         //创建Class对象方法二
24         Class personClass3=Person.class;//一个Class对象代表一份字节码,相同类型的对象的字节码是一样的
25         System.out.println(personClass3==personClass1);
26         //int.class;
27         //void.class;
28         //创建Class对象方法三
29         Class personClass4=Class.forName("com.gh.ref.Person");//可能类找不到会抛异常,注意加包名
30         System.out.println(personClass4==personClass1);
31         //--------通过类信息实例化对象--------
32         //调用无参构造方法
33             Person p3;
34             try {
35                 p3 = (Person)personClass4.newInstance();
36                 System.out.println(p3);//因为调用无参构造所以全为空,如果类中没有无参构造方法将会报异常
37             } catch (InstantiationException | IllegalAccessException e1) {
38                 e1.printStackTrace();
39             }
40         //调用有参构造方法
41         Constructor[] cons= personClass4.getConstructors();//获得当前类的所以构造方法
42         Person p4=null;
43         try {
44             //传指定参数的Class对象
45             Constructor c=personClass4.getConstructor(String.class,int.class,char.class);
46             p4=(Person) c.newInstance("小花",18,‘女‘);
47             System.out.println(p4);
48         } catch (Exception e) {
49             e.printStackTrace();
50         }
51         //----------通过类取得类信息-------
52         System.out.println("包信息:"+personClass.getPackage().toString());//返回一个包类
53         System.out.println("类名:"+personClass.getName());
54         //获取类的方法信息
55         Method[] ms=personClass.getMethods();
56         /**
57          * 返回一个包含某些 Method 对象的数组,
58          * 这些对象反映此 Class 对象所表示的类或接口
59          *(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法
60          * 如果只要本类自己定义方法(包括私有)可以用getDeclaredMethods()
61          */
62         for (Method m : ms) {
63             //获取访问修饰符返回的是数字,需要Modifier来转
64             System.out.println("方法名"+Modifier.toString(m.getModifiers())+"-"+m.getName());
65         }
66         //获取类的属性信息,getDeclaredFields()获取私有
67         Field[] fs=personClass.getFields();//公有属性,Person没有
68         for (Field f : fs) {
69             System.out.println("属性名:"+f.getName());
70         }
71         System.out.println("---------调用方法--------");
72         try {
73             Method m=personClass4.getMethod("setName", String.class);
74             m.invoke(p4, "花花");
75             System.out.println(p4);
76             //如果调用私有方法say
77             Method m1=personClass4.getDeclaredMethod("say");//注意可以调私有方法的方法
78             m1.setAccessible(true);//忽略验证修饰符,让其对外可见
79             m1.invoke(p4);
80         } catch (Exception e) {
81             e.printStackTrace();
82         }
83         System.out.println("---------调用属性--------");
84         Field agef=personClass4.getDeclaredField("age");
85         agef.setAccessible(true);//忽略验证修饰符
86         System.out.println(agef.get(p4));//获得p4的年龄
87         agef.setInt(p4, 11);//设置p4的年龄值
88         System.out.println(p4);
89     }
90 }
时间: 2024-10-13 02:41:52

java学习之反射的相关文章

java学习之 反射

以前学习java只是学习了基本语法操作,各种常用方法的使用,随着慢慢学习,很多大神都觉得要想成为大神,就必须把java的反射给理解透,这样我就带着好奇的心去学习到底反射是什么玩意,所以就上网找资料学习去了,没想到收获真的不小,其实我们平时用的跟多操作都是通过反射来完成的,比如对于servlet在web.xml的配置都是同过反射来新建一个对象,还有SSH都是通过反射来实例化对象的,通过了反射让我更好的理解SSH框架.下面小弟就开始小谈一下反射的详细内容吧, 由于本人水平有限,若文章在表述和代码方面

Java学习之反射机制

前段时间在做项目的时候,由于是用的纯Servlet基础框架进行开发的,没有用到那些集成的框架,后来在后台处理表单中的数据的时候,感觉有很多东西都是重复的,比较繁琐,例如获取到前台页面表单中的值之后,要在后台实例化一个对象并且调用定义的setter方法来给对象赋值,由于表单中的数据比较多,然后这个调用setter方法的代码就显得有些重复臃肿,后来网上查资料才了解到可以通过java中的反射机制简化这一操作,并且也知道了很多框架里面也都用到了反射... 一.什么是反射机制 JAVA反射机制是在运行状态

Java学习:反射机制简介

反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 通俗点讲,通过反射,该类对我们来说是完全透明的,想要获取任何东西都可以. 反射机制能做什么 反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类: 在运行时构造任意一个类的对象: 在运行时判断任意一个类所具有的成员变量和方法: 在运行时调用任意一个对象的方法: 生成动

Java学习之反射机制及应用场景

前言: 最近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,既然用到了就想着好好学习总结一下,其实无论是之前的EventBus 2.x版本还是Retrofit.早期的View注解框架都或多或少的用到Java的反射机制.以下是自己使用反射的两个地方,感兴趣的同学可以看下:Android okHttp网络请求之Json解析,Android业务组件化之子模块SubModule的拆分以及它们之间的路由Router实现. 什么是Java反射机制? JAVA反射机制是在运行状态中,对于任

黑马程序员-JAVA学习之反射以及Class类的常用方法

--------android培训.java培训.期待与你交流!-------- Class类 Class 类的实例表示正在运行的 Java 应用程序中的类和接口.枚举是一种类,注释是一种接口.每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象.基本的 Java 类型(boolean.byte.char.short.int.long.float 和 double)和关键字 void 也表示为 Class 对象. Class 没有公共构造方法

Java学习:反射

类加载器(1)什么是类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接, 初始化三步来实现对这个类进行初始化. 一个类在加载过程中的三部曲: 1.加载 就是指将class文件读入内存,并为之创建一个Class对象. 任何类被使用时系统都会建立一个Class对象. 2.连接 验证 是否有正确的内部结构,并和其他类协调一致 准备 负责为类的静态成员分配内存,并设置默认初始化值 解析 将类的二进制数据中的符号引用替换为直接引用 3.初始化 就是我们以前讲过的初始化步骤

Java学习笔记——反射

反射就是把Java类中的各种成分映射成相应的java类. Class类-->java程序中的各个java类属于同一事物,描述这类事物的Java类名就是Class. Class.forName的作用:返回类的字节码,返回的方式有两种,一种是这个类曾被加载过,则直接从JVM中返回字节码,另一种是JVM中没用这个类的字节码,得用类加载器先将字节码加载到JVM中,然后返回字节码. 得到类的字节码的三种方式1.类名.class2.对象.getClass();3.Class.forName("完整类名

黑马程序员-JAVA学习之反射getDeclaredField()方法与getField()方法的区别

--------android培训.java培训.期待与你交流!-------- 在使用反射的时候,常用到的几个方法老是傻傻的分不清楚是干吗的,功能差不多的啊,比如:Class.getFields(), Class.getField(String), Class.getDeclaredFields(), Class.getDeclaredField(String)和Class.getMethods(), Class.getMethod(String, Class[]), Class.getDec

Java学习笔记--反射

待完成 http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html http://www.cnblogs.com/jqyp/archive/2012/03/29/2423112.html http://coolszy.iteye.com/blog/569846 http://www.cnblogs.com/octobershiner/archive/2012/03/18/2404751.html package com.ev