博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
黑马程序员——反射总结
阅读量:6327 次
发布时间:2019-06-22

本文共 3117 字,大约阅读时间需要 10 分钟。

                  ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
什么是反射?
毕老师说“万物皆对象”,每个Java类可以构成一个对象,同时每个Java类也可以由一个Class类封装成对象,反射就是把类中的成员变量,构造函数,方法,包都封装成类,在封装的类中,操作类和类中的成员。
 
为什么要用反射?
在框架结构中反射用的最多,这就像生产一部汽车,我们这里有一副汽车构造图,而轮子,车身,发动机等车的部件通过不同的部门生产出来,最后装配在一起,实现了流水线高效率的生产!我们程序员开发软件,框架就像软件开发的构造图,我们每个程序员不同的功能部分,最后所有程序员开发的代码拼在这个框架中,实现了软件高效率的开发!而在这个框架做好时,不同的功能部分的实现只要通过反射调用各个类,就可以实现不同功能模块的组装!反射对高效率的开发是很关键的!
 
Class对象三种实现方式
Class  cls1= String.class;
Class  cls2 = new string().getClass();
Class cls3 = Class.forName("java.lang.String");
 
构造函数的反射
获取构造函数的Constructor对象
byte[] a = new byte[3];
Constructor constuctor1 = Class.forName("java.lang.String").getConstructor(byte[].class,int.class,int.class);
Constructor constuctor2= Class.forName("java.lang.String").getConstructors();
通过Constuctor建立对象
String str1 = constuctor.newIntance(a,0,a.length);
注意:cls1.newInstance()也是可以直接创建对象的
 
成员变量的反射
class Student
{
    public int x;
    private int y;
    Student(int x,int y)
    {
        this,x = x;
        this.y = y;
    }
 }
Student stu = new Student(2,3);
获取成员变量的Field类对象
Field field1 = Class.forName("java.lang.Student").getField("x");
Field field2 = Class.forName("java.lang.Student").getFields();
Field field3 = Class.forName("java.lang.Student").getDeclaredField("y");
获取Field类对象的值
field1.get(stu);
field3.setAccessible(ture);
field2.get(stu);
修改成员变量的值
field1.set(stu,3);
 
方法的反射
获取方法Method类对象
String str = new String("abced");
Method method1 = str1.getClass().getMethod("CharAt",int.Class);
Method method2 = str1.getClass().getMethods();
调用某个对象的方法
method1.invoke(str,2);
注意,如果method1.invoke(null,2)表示调用的是静态方法
在jdk 1.4版本中调用应该为method1.invoke(str,new Object[]{2});
 
数组的反射
获取数组的Class对象
int[] a = new int[3];
int[] b = new int[4];
int[] [] c = new int[3][4];
String[] d = new String[3];
Class cls1 = a.getClass();
Class cls2 = b.getClass();
Class cls3 = c.getClass();
Class cls4= d.getClass();
其中 cls1 == cls2,只要类型和维度一样,数组的Class对象即相等
创建数组对象
Object  array =Array.newInstance(cls1,10);
为数组某个位置赋值
Array.set(array,5,4)
获取数组的值
Array.get(array,5);
1 练习: 2 写一个程序,这个程序能够通过用户指定的类名去执行该类的main方法。 3 package bolgtest; 4  5 import java.lang.reflect.Method; 6  7 public class BolgTest1 { 8  public static void main(String[] args) throws Exception{ 9  10   Class cls = StudentTest.class;11   Method method = cls.getMethod("main", String[].class);12   method.invoke(null, new Object[]{
new String[]{"abc","dgf"}});13 14 }15 16 }17 18 19 package bolgtest;20 public class StudentTest{21 public static void main(String[] args){22 Student stu = new Student("zhangshan",23);23 System.out.println(stu);24 }25 }26 class Student {27 private String name;28 private int age;29 30 public Student(String name, int age) {31 super();32 this.name = name;33 this.age = age;34 }35 36 public void setName(String name) {37 this.name = name;38 }39 40 public String getName() {41 return name;42 }43 44 public void setAge(int age) {45 this.age = age;46 }47 48 public int getAge() {49 return age;50 }51 public String toString()52 {53 return "name = " + name + "...." + "age = " + age;54 }55 56 57 58 }59 60 61 62 63 64

 

转载于:https://www.cnblogs.com/yuemingxingxing/p/5078043.html

你可能感兴趣的文章
loj10099 矿场搭建
查看>>
JQ 1
查看>>
简单用CreateThread传递自定义参数
查看>>
机器学习资源
查看>>
DJANGO 自定义分页组件
查看>>
【LeetCode每天一题】Convert Sorted Array to Binary Search Tree(根据有序数组构建平衡二叉树)...
查看>>
DES加密系统的实现
查看>>
使用MVC创建API
查看>>
CodeForces Round 521 div3
查看>>
Spring Boot 使用 AOP 实现页面自适应
查看>>
如何检测被锁住的Oracle存储过程及处理办法汇总(转)
查看>>
GString及IntelliJIdea中调试Groovy的操作步骤
查看>>
setInterval 传参数
查看>>
2013长沙邀请赛A So Easy!(矩阵快速幂,共轭)
查看>>
python JoinableQueue在生产者消费者项目中的简单应用
查看>>
asp.net core中写入自定义中间件
查看>>
Multiple annotations found at this line
查看>>
[日常] Go语言圣经-匿名函数习题2
查看>>
基于Spring + Spring MVC + Mybatis 高性能web构建
查看>>
mysql 格式化日期 DATE_FORMAT,FROM_UNIXTIME,UNIX_TIME等
查看>>