标签:name 函数 out 加载 pre class 没有 ide 构造
反射机制定义:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
Class类定义:
类是具有相同属性和行为的一类事物,类本身也可以进行抽象,因为类们也具有相同的属性和行为,比如都具有(属性,构造函数,方法,都能调用方法,)所以将类们又抽象成一个类Class。Class类继承object类。用于操纵类的属性,方法,构造器。
Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。
3中方法获取类的类对象:
Class<?> clas=Class.forName("java.lang.String");
Class<Person> cals=Person.class;
下面是反射机制的实例:
Person类:
package com.rl.reflect; public class Person { private String name; private String address; private Integer age; private String desc; public Person(){ } public Person(String name, String address, Integer age, String desc) { super(); this.name = name; this.address = address; this.age = age; this.desc = desc; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } @Override public String toString() { return "Person [name=" + name + ", address=" + address + ", age=" + age + ", desc=" + desc + "]"; } public static void test(){ System.out.println("this is a test"); } }
测试类:
通过反射获取Person类中的构造器 并创建实例对象,再通过反射调用方法为对象赋值。
public class Test3 { public static void main(String[] args) throws Exception{ Class<?> clas=Class.forName("com.rl.reflect.Person"); //根据无参构造器创建对象 Constructor<?> constructor=clas.getDeclaredConstructor(new Class[]{}); /* public T newInstance(Object ... initargs) 可变参数应该放数组*/ //反向调用方法 Method test=clas.getDeclaredMethod("test", new Class[]{}); Object object=constructor.newInstance(new Object[]{}); test.invoke(object, new Object[]{}); //调用setName() 并输出toString Method setName=clas.getDeclaredMethod("setName", new Class[]{String.class}); Method toString=clas.getDeclaredMethod("toString", new Class[]{}); setName.invoke(object, new Object[]{"王五"}); //输出 System.out.println(object); toString.invoke(object, new Object[]{}); System.out.println(object); Constructor<Person> cons=(Constructor<Person>) clas.getDeclaredConstructor(new Class[]{String.class,String.class,Integer.class,String.class}); Person per=cons.newInstance(new Object[]{"张三","成都",20,"爱好打球"}); System.out.println(per); } }
标签:name 函数 out 加载 pre class 没有 ide 构造
原文地址:https://www.cnblogs.com/MyJavaStudy/p/9025632.html