08反射---如何得到对象

1.什么是反射? 

反射是一种机制,利用反射机制动态的实例化对象、读写属性、调用方法、构造函数。

2.如何得到类对象 

     一切反射相关的代码都从获得类对象开始

 3种获取方式: 

      2.1 类名.class;
     2.2 对象名.getClass();
     2.3 Class.forName(全限定名/全路径名) 

	// 传统方式
		 Hello hello = new Hello();
		 System.out.println("hello=" + hello);
		
		 //反射方式
		 Class cls = Class.forName("com.zking.reflect.entity.Hello");
		 Object hello1 = cls.newInstance();
	    System.out.println(hello1);
		// 1)一切与反射相关的操作都从获取类对象开始(3)
		 Class cls= Hello.class;
		// 2)对象名.getClass()
		// 3)Class.forName(类的全路经名/权限定名)
		
		 Class cls= Class.forName("com.zking.reflect.entity.Hello");
		  System.out.println("获取类的全路径名="+cls.getName());
		  System.out.println("获取类的简单的类名="+cls.getSimpleName());
		 System.out.println("获取访问修饰符="+cls.getModifiers());
		  System.out.println("获取包名="+cls.getPackage());
		

 

3.根据类得到类名(全限定名/全路径名) 

    1)cName.getName();            -->获取全限定名
    2)cName.getSimpleName();         -->获取类名
    3)cName.getPackage();             -->获取包名

 4.根据类得到类的属性

     Field field=cla.getField(“属性名”);

    field.getName();            -->获取属性名            
    filed.getType();            -->获取属性类型        
    field.getModifiers();            -->获取属性访问修饰符    
    field.set(Object,Object);         -->设置属性值,参数1:要设置属性所在对象;参数2:要设置的值;    
    field.get(Object);            -->获取属性值,参数:要获取属性值的对象                
    field.getDeclaredField(“属性名”);    -->获取单个属性(私有、公有、受保护、默认、静态)    
    field.getDeclaredFields();        -->获取所有属性(私有、公有、受保护、默认、静态)

5.根据类得到类的方法 

  //无参无返回、无参有参会、有参无返回、有参有返回
    cla.getMethod();            -->获取单个公有方法
    cla.getDeclaredMethod();        -->获取当个方法(包括私有、受保护、默认、公有)
    cla.getMethods();            -->获取所有公有方法
    cla.getDeclaredMethods();        -->获取所有的方法(包括私有、受保护、默认、公有)

// 获取类对象
		Class cls = Student.class;
		// 反射机制实例化对象
		Student stu = (Student) cls.newInstance();
		 4.读取属性(Field)
		 1)获取单个公共的属性
		 Field field=cls.getField("name");
		 2)获取单个公共的,私有的,受保护的,最终的..属性
		 只要是有公开的就是用getDeclaredField("age");
		 Field field = cls.getDeclaredField("sid");
		 3)获取所有的公共的属性
		 Field[] fields=cls.getFields();
		 Field[] fields=cls.getDeclaredFields();
		 //4)获取所有公共的,私有的,受保护的,最终的..属性
		 for (Field field : fields) {
		 System.out.println("获取属性名="+cls.getName());
		 System.out.println("获取属性访问修饰符="+cls.getModifiers());
		 System.out.println("获取属性类型="+cls.getPackage());
		 }

 

6.根据类得到类的构造方法 

 cla.getConstrutor();            -->获取单个公有构造方法
    cla.getDeclaredConstrutor();        -->获取单个构造方法(包括私有、受保护、默认、公有)
    cla.getConstrutors();            -->获取所有的公有构造方法
    cla.getDeclaredConstrutors();        -->获取所有的构造方法(包括私有、受保护、默认、公有)

 6.获取方法构造函数(Method)
//		 有参有返,有参有返,无参有返,无参无返
//		 1)获取单个公共的方法
		 Method method=cls.getMethod("hello", null);

		// 2)获取公共的,私有的,受保护的,最终的..方法
		 Method method= cls.getDeclaredMethod("add", Integer.class,Integer.class);
		 //3)获取所有的公共的方法
		 Method[] methods= cls.getMethods();

		// 4)获取所有的公告的,私有的,受保护的,最终的..等等方法
		 Method[] methods=cls.getDeclaredMethods();
		 for (Method method2 : methods) {
		 System.out.println("=======================");
		 System.out.println("获取方法名"+method.getName());
		 System.out.println("获取访问修饰符"+method.getModifiers());
		 System.out.println("获取访问数量"+method.getParameterCount());
		 System.out.println("获取访问类型"+method.getReturnType());
		 }
		// 5)调用方法
		 Method method = cls.getMethod("add", Integer.class,Integer.class);
		 // 执行方法
		 Object returnvalues = method.invoke(stu, 10 ,20);
		 System.out.println(returnvalues);

		// 6)调用构造函数
		Constructor cons = cls.getConstructor(null);
		cons.setAccessible(true);
		cons.newInstance(20);

 

7.根据类得到类的实现接口列表 

  Class[] interface=cla.getInterfaces();    -->获取类对象中所有实现接口列表

	Class cls = Person.class;
    Class field = cls.getSuperclass();
		// 遍历、
		Class[] field1 = cls.getInterfaces();
		for (Class class1 : field1) {
			System.out.println(class1.getName());
		}

		System.out.println(field.getName());

 


8.作业
1)新建实体类Person
2)三个字段:pid pname psex
3)要求该类有父类,并且实现多接口
4)通过反射得到该类所有的属性和方法,父类和实现接口

public class Person extends Student implements UserDao,RoleDao
   pid
   pname
   psex

public class Student
   sname
   sid
   ....

public interface UserDao
   ...
public interface RoleDao
   ...

(有兴趣的朋友可以·康康)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值