一 用class.forname反射获取对象(必须要一个无参的构造函数)
package com.learing._01;
class Student{
public Student(){
System.out.println("Student类的构造方法");
}
@Override
public String toString(){
return "Student类的toString()方法";
}
}
public class ReflectDemo {
public static void main(String args[]) throws Exception{
Class<?> cls = Class.forName("com.learing._01.Student");
Object obj = cls.newInstance();
}
}
输出结果
二 获取构造方法
package com.learing._01;
import java.lang.reflect.Constructor;
public class ReflectStringDemo {
public static void main(String args[]) throws Exception{
Class<?> cls = Class.forName("java.lang.String");
Constructor<?> cons[] = cls.getConstructors();
for(int i = 0 ; i < cons.length ; i++){
System.out.println(cons[i]);
}
}
}
输出结果
三 通过构造方法实例化对象
package com.learing._01;
import java.lang.reflect.Constructor;
class Student {
private String name;
private Integer age;
public Student(String name, Integer age) {
this.name = name;
this.age = age;
}
public Student() {
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}
public class ReflectDemo {
public static void main(String args[]) throws Exception {
Class<?> cls = Class.forName("com.learing._01.Student");
Constructor<?> cons = cls.getConstructor(String.class,Integer.class);
Object obj = cons.newInstance("SMITH",20);
System.out.println(obj.toString());
}
}
输出结果
四 通过反射获取方法
此功能用于IDE开发工具,当输入一“.”时候,会出来该类有哪些方法
package com.learing._01;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
interface Message{
public void get();
}
class Student implements Message{
@Override
public void get() {}
public void print(String name,int age){}
public void fun() throws Exception{}
}
public class ReflectDemo {
public static void main(String args[]) throws Exception {
Class<?> cls = Class.forName("com.learing._01.Student");
Method met[] = cls.getMethods();
for(int i = 0 ; i < met.length ; i++){
//以下 partA的输出和partB一样
// partA
// System.out.println(met[i]);
// partB start
System.out.print(Modifier.toString(met[i].getModifiers())+" ");//得到修饰符 public final native
System.out.print(met[i].getReturnType().getSimpleName()+" ");//得到返回类型 void
System.out.print(met[i].getName()+"("); // 得到方法名 get,print
Class<?> params[] = met[i].getParameterTypes(); //得到方法的参数类型
if(params!=null&¶ms.length > 0 ){
for(int j = 0 ; j < params.length ; j++){
System.out.print(params[j].getSimpleName()+""); //取参数
if(j<params.length-1){
System.out.print(" , ");
}
}
}
System.out.print(") ");
Class<?> exceps[] = met[i].getExceptionTypes(); //获取异常
if( exceps!=null && exceps.length>0 ){
System.out.print(" throws ");
for(int j = 0 ; j < exceps.length ; j++){
System.out.print(exceps[j].getSimpleName());
if(j < exceps.length -1){
System.out.print(", ");
}
}
}
System.out.println();
// partB end
}
}
}
输出结果
五 反射调用方法
package com.learing._01;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
class Student{
private String name;
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
}
public class ReflectDemo {
public static void main(String args[]) throws Exception{
Class<?> cls = Class.forName("com.learing._01.Student");
Object obj = cls.newInstance(); //实例化对象
Method setNameMethod = cls.getMethod("setName", String.class);
Method getNameMethod = cls.getMethod("getName");
setNameMethod.invoke(obj, "SMITH"); // 对象.setName("SMITH");
System.out.println(getNameMethod.invoke(obj));
}
}
输出结果
六 属性操作
package com.learing._01;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
interface Message{
public static final String INFO = "hello world";
}
class Person{
private String name;
private Integer age;
}
class Student extends Person implements Message{
private String school;
private Double price;
}
public class ReflectDemo {
public static void main(String args[]) throws Exception{
Class<?> cls = Class.forName("com.learing._01.Student");
{
//取得继承而来的全部属性
System.out.println();
Field fields[] = cls.getFields();
System.out.println("继承而来的属性");
for(int i = 0 ; i < fields.length ; i++){
System.out.println(fields[i]);
}
}
{
//取得本类定义的全部属性
System.out.println();
Field fields[] = cls.getDeclaredFields();
System.out.println("本类定义的全部属性");
for(int i = 0 ; i < fields.length ; i++){
System.out.println(fields[i]);
}
}
{
//取得父类属性
System.out.println();
Field fields[] = cls.getSuperclass().getDeclaredFields();
System.out.println("父类属性定义的全部属性");
for(int i = 0 ; i < fields.length ; i++){
System.out.println(fields[i]);
}
}
{ //操作属性
System.out.println();
System.out.println("属性的操作");
Object obj = cls.newInstance();
Field schoolField = cls.getDeclaredField("school");
schoolField.setAccessible(true);//以为school属性为private ,setAccessible可以操作该属性
schoolField.set(obj,"清华大学");
System.out.println(schoolField.get(obj));
}
}
}
输出结果