反射的基本使用方法

(初学java,个人见解,不一定正确)

package Reflect;

public class ClassDemo {  //重现!!!----> 到位---->自己检查自己
	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
		Class c1 = null;//类对象,Class是JDK中的一个类名
		Class c2 = null;
		Class c3 = null;
		
		Student student = new Student();
		
		//Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass方法自动构造的。 
		//1. 类名.class属性 ,更安全,性能更高
		c1 = Student.class;//jvm加载的时候给的class属性
		
		//2.调用Class的静态方法forName()
		c2 = Class.forName("com.bdqn.base.Student");
		
		//3.对象.getClass方法
		c3 = student.getClass();
		
		System.out.println(c1.getName());
		System.out.println(c2.getName());
		System.out.println(c3.getName());
		
//		Object obj = c3.newInstance();
//		Student stu = (Student) obj;
//		stu.setName("张三");
//		
//		System.out.println(stu.getName());
	}
}
package Reflect;

public class Person {
	private String langure;
	public String country;
	
	public void work(String s) {
		System.out.println("工作为:"+s);
	}
}
package Reflect;

import java.io.Serializable;
//反射我们项目中都会用到,但不一定是要程序员去敲这些代码
public class Student extends Person implements Serializable,Comparable<Student>{
		    //对象要像能序列化,必须实现Serializable接口,表示其对象是可序列化的
			//Serializable是给jvm用的,我们不需要实现任何它的任何方法
			public static final String XXX="";
			public String name;
			private String gender;
			private int age;
			//反射能看到私有化的数据,跟封装有没有冲突?没有冲突,封装的目的是不让别人随便动,不是不让别人知道
			
			public Student() {
				super();
			}
			
			private Student(String name) {
				super();
				this.name = name;
			}
	
			public Student(String name, String gender, int age) {
				super();
				this.name = name;
				this.gender = gender;
				this.age = age;
			}
	
			public String getName() {
				return name;
			}
	
			public void setName(String name) {
				this.name = name;
			}
	
			public String getGender() {
				return gender;
			}
	
			public void setGender(String gender) {
				this.gender = gender;
			}
	
			public int getAge() {
				return age;
			}
	
			public void setAge(int age) {
				this.age = age;
			}
		
		@Override
		public int compareTo(Student o) {
			// TODO Auto-generated method stub
			return 0;
		}
		public void study(String s) throws NullPointerException {
			System.out.println(s);
		}
		
		private void play(String str) {
			System.out.println("王者荣耀");
		}
		public void play01(String str){
			System.out.println("核平精英");
		}
	}
package Reflect;

import java.lang.reflect.Constructor;

public class TestConstructors {
	//获取某个类中的全部公开构造函数
		public static void main(String[] args) throws Exception {
			Class clas = Class.forName("Reflect.Student");
			
			Constructor[] cons = clas.getConstructors();//获取该类的所有公开构造
			
			//输出所有构造方法的名以及参数列表
			//类似格式Student(String name, String gender, int age)
			for(int i=0;i<cons.length;i++) {
				System.out.print(cons[i].getName()+"(");//获取构造方法的名字
				
				Class<?>[] paras = cons[i].getParameterTypes();//获取构造方法的参数列表
				
				for(int j=0;j<paras.length;j++) {
					if(j == paras.length - 1) {
						System.out.print(paras[j].getName());
					}else {
						System.out.print(paras[j].getName()+",");
					}
				}
				
				System.out.println(")");
			}
			
			Student stu = (Student) cons[0].newInstance("波波","男",18);//通过构造器创建对象
			//在不知道student代码的情况下,我们可以通过反射拿到构造函数,用来创建对象
			System.out.println(stu.getName());
		}
}
package Reflect;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class TestField {
	//获取某个类的全部属性
		public static void main(String[] args) throws Exception {
			Class clas = Class.forName("Reflect.Student");
			//获取该类自定义的属性
			Field[] df = clas.getDeclaredFields();
			for(int i=0;i<df.length;i++) {
				Field f = df[i];//f.getModifiers()获取熟悉的的访问修饰符,public=1,private=2,protected=4,static=8
				System.out.print(f.getModifiers()+" "+Modifier.toString(f.getModifiers()) +" "+f.getType()+" "+f.getName());
				System.out.println();//Modifier.toString()得到访问修饰符对应的字符串
				
				System.out.println(Modifier.isPublic(f.getModifiers()) && Modifier.isStatic(f.getModifiers()));
			}
			
			//获取该类所有,包括从父类继承过来的公开的属性
			Field[] df2 =clas.getFields();
			System.out.println(df2.length);
			for(int i=0;i<df2.length;i++) {
				Field f = df2[i];
				System.out.print(Modifier.toString(f.getModifiers()) +" "+f.getType()+" "+f.getName());
				System.out.println();
			}
		}

}
package Reflect;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class TestMethods {
	//获取某个类的全部公共方法
		public static void main(String[] args) throws Exception {
			Class clas = Class.forName("Reflect.Student");
			
			Method[] ms = clas.getMethods();
			
			for(int i=0;i<ms.length;i++) {
				Method m = ms[i];
				
				Class[] pas = m.getParameterTypes();
				
				StringBuilder params = new StringBuilder();
				for(int j=0;j<pas.length;j++) {
					params.append(pas[j].getName()).append(",");
				}
				
				Class[] es = m.getExceptionTypes();
				
				StringBuilder se = new StringBuilder();
				for(int j=0;j<es.length;j++) {
					se.append(es[j].getName()).append(",");
				}
				
				System.out.println(Modifier.toString(m.getModifiers())+" "+m.getReturnType().getName()+" "+m.getName()+"("+params+")"+"throws "+se);
		}
	}
}
package Reflect;

public class TestParent {
	    //学反射的目的:是告诉你怎么样去获得这个类的内部结构,分析这个类的关系
		//获取一个对象的父类与实现的接口
		public static void main(String[] args) throws ClassNotFoundException {
			Class clas = Class.forName("Reflect.Student");
			Class<?> parent = clas.getSuperclass();//获取父类
			System.out.println(clas.getName()+"的父类为:"+parent.getName());
			
			Class<?>[] ims = clas.getInterfaces();//获取父接口,多个,用Class的数组接收
			for(int i=0;i<ims.length;i++) {
				System.out.println(clas.getName()+"实现的接口为:"+ims[i].getName());
			}
		}
}
package Reflect;

import java.lang.reflect.Field;

public class TestUseField {
	//通过反射机制调用某个类的属性
		public static void main(String[] args) throws Exception {
			Class clas = Class.forName("Reflect.Student");
			
			Field f = clas.getDeclaredField("gender");//拿某对象的某属性
			f.setAccessible(true);//设置此属性可以访问到
			
			Object obj = clas.newInstance();
			
			f.set(obj, "你好!");//给某对象设置一个filed
			
			Student stu = (Student) obj;
			System.out.println(stu.getGender());
		}
}
package Reflect;

import java.lang.reflect.Method;

public class TestUseMethod {
	//通过反射机制调用某个类的方法
		public static void main(String[] args) throws Exception {
			Class clas = Class.forName("Reflect.Student");
			Method m = clas.getMethod("study", String.class);
			//m是代表方法对象,它要被某个对象调用,对象点方法
			
			m.invoke(clas.newInstance(), "java反射技术");//执行某对象的此 m 方法
			
		}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值