美文网首页
javaSE - 011 - 反射

javaSE - 011 - 反射

作者: 离子来了 | 来源:发表于2016-04-03 20:54 被阅读17次

反射(Reflection)

  • 在运行时判断任意一个对象所属的类
  • 在运行时构造任意一个类的对象
  • 在运行时判断任意一个类所具有的成员变量和方法
  • 在运行时调用任意一个对象的方法

反射的常用类

  • Class类,代表一个类。由JVM在加载类的时候生成
    1.获取某个类对应Class的三种方式
  Class<?>  classType1 = Class.forName("javaSEtest.Person"); //获取字节码
  Class<?>  classType2 = Person.class;
  Class<?> classType3 = new Person().getClass();
  • Field类,代表类的成员变量
  • Method类,代表类的方法
  • Constructor 类,代表类的构造方法
  • Array类,提供了动态创建数组,以及访问数组元素的静态方法

反射的入口是一个class(字节码)

反射初探

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class test {

 public static void main(String[] args) throws Exception{
  Class  classType = Class.forName("javaSEtest.Person"); //获取字节码
  Method m = classType.getMethod("sayHello", String.class);//获取方法
  Constructor c =classType.getDeclaredConstructor(String.class);//获取构造方法
  Object o = c.newInstance("铜驼");//获取相应的对象
  System.out.println(m.invoke(o, "tongliya"));//方法调用
 }
}
class Person{
 String name;
 Person(){
  this.name = "爱好";
 }
 Person(String name){
  this.name = name;
 }
 public String sayHello(String s){
  return name +" say hello:To" + s;
 }
}
对象的复制
public class test {
 public static Object copy(Object o) throws Exception {
  Class<?> copyClass = o.getClass();
  Constructor<?> constructor = copyClass.getConstructor();
  Object copyObject = constructor.newInstance();
  Field[] fields = copyClass.getDeclaredFields();
  for (Field f : fields) {
   String fieldName = f.getName();
   String firstNameUpper = fieldName.substring(0, 1).toUpperCase();
   String getM = "get" + firstNameUpper + fieldName.substring(1);
   String setM = "set" + firstNameUpper + fieldName.substring(1);

   Method getMethod = copyClass.getMethod(getM);
   Method setMethod = copyClass.getMethod(setM, f.getType());

   Object value = getMethod.invoke(o);
   setMethod.invoke(copyObject, value);

  }
  return copyObject;
 }

 public static void main(String[] args) throws Exception {
  Person p = new Person("liyang", 26, 100);
  Person copyP = (Person) copy(p);
  System.out.println(copyP);
 }
}

class Person {
 String name;
 int age;
 int core;

 public Person() {
 }

 public Person(String name, int age, int core) {
  super();
  this.name = name;
  this.age = age;
  this.core = core;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public int getAge() {
  return age;
 }

 public void setAge(int age) {
  this.age = age;
 }

 public int getCore() {
  return core;
 }

 public void setCore(int core) {
  this.core = core;
 }

 @Override
 public String toString() {
  return "Person [name=" + name + ", age=" + age + ", core=" + core + "]";
 }
}

java.lang.reflect.Array初探

  //一维
  Object a = Array.newInstance(String.class, 10);
  Array.set(a, 1, "liy");
  System.out.println(Array.get(a, 1));
  //多维
  String[][][][][] s =  (String[][][][][])Array.newInstance(String.class, 2,3,4,5,6);
  s[1][2][3][4][5] = "liyang";
  System.out.println(s[1][2][3][4][5]);

私有变量和方法的访问

public class test {

 public static void main(String[] args) throws Exception {
  Class<?> classa = Person.class;
  // Method m = classa.getMethod("sayHello"); //只能访问public的
  Method m1 = classa.getDeclaredMethod("sayHello");// 没有限制都可以访问
  m1.setAccessible(true);// 破坏掉原生的java访问限制,设置为true就可以访问私有的了,
  Person p = new Person();
  System.out.println(m1.invoke(p));

 Field f = classa.getDeclaredField("name");
  f.setAccessible(true);//设置私有可访问
  System.out.println(f.get(p));
  f.set(p, "liyang");
  System.out.println(f.get(p));
 }
}

class Person {
 private String name = "limengxia";
  private String sayHello() {
  return "Hello";
 }
}

相关文章

  • javaSE - 011 - 反射

    反射(Reflection) 在运行时判断任意一个对象所属的类 在运行时构造任意一个类的对象 在运行时判断任意一个...

  • JavaSE——反射机制

    声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互...

  • JavaSE——反射机制(二)

    声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互...

  • JavaSE学习笔记——反射

    Java Reflection反射是动态语言实现的关键发射机制允许在执行期间借助Reflection API取得任...

  • 什么是反射?

    一、反射的定义 本文基于 JDK8,Oracle官网[https://docs.oracle.com/javase...

  • javaSE_day17_反射

    应用程序启动: java 类名 调用JVM,启动 JVM进程 应用程序结束: 1.所有代码执行完了; ...

  • 2020-10-31-Java-复习44(java基础知识)

    注意javase 中的对象理解 io流 反射机制 1.java 和 C++ 区别 都是面向对象的语言,都支持封...

  • javase part25 - 反射机制

    反射概念: 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应...

  • JavaSE进阶十一 反射机制一

    1,反射机制 反射机制有什么作用通过java语言中的反射机制可以操作字节码文件;有点类似于黑客,可以读和修改字节码...

  • JavaSE进阶十一 反射机制二

    1,可变长度参数 语法:类型... (注意:一定是3个点) 可变长度参数要求参数个数是:0-N个。 可变长度参数在...

网友评论

      本文标题:javaSE - 011 - 反射

      本文链接:https://www.haomeiwen.com/subject/wbyulttx.html