反射和反编译

反射

Class c =Class.forName("线程.User");
		
		/*获取所有public 修饰的属性
		Field[] fs =c.getFields();
		System.out.println(fs.length);
		System.out.println(fs[0].getName());//age
		*/
		Field[] fs =c.getDeclaredFields();		//获取所有的属性,id,age....,
		/*
		for(Field field :fs){
			Class type =field.getType();	//获得属性
			//System.out.println(type.getName());//java.lang.String
			System.out.println(field.getName());	//获取的是id,arr 
			
			System.out.println(type.getSimpleName());//获取的是String
			
			int i =type.getModifiers();
			//System.out.println(i);
			String str =Modifier.toString(i);		
			System.out.println(str);		//获取的是private
		}
		*/
		StringBuffer  s =new StringBuffer();
		s.append(Modifier.toString(c.getModifiers())+" class "+c.getSimpleName()+"{\n");
		for(Field fid :fs) {
		s.append("\t");
		s.append(Modifier.toString(fid.getModifiers())+" ");
		s.append(fid.getType().getSimpleName()+" ");
		s.append(fid.getName()+";\n");
		}
		s.append("}");
		System.out.println(s);
		
		Field f =c.getDeclaredField("id"); //获得id
		Object  o =c.newInstance();
		//打破封装
		f.setAccessible(true);//如果是private就用setAccessible;
		f.set(o, "250");
		System.out.println(f.get(o));

防止反射调用

private static demo01 s;
	private demo01() {
		if(s!=null) {
			throw new RuntimeException();	//防止反射调用
		}
	}
	public static synchronized demo01 danli() {
		if(s==null) {
			s =new demo01();
		}
		return s;
	}

test类中测试

Class<demo01> clazz =(Class<demo01>)Class.forName("反射.demo01");
		Constructor<demo01> c =clazz.getDeclaredConstructor(null);
		c.setAccessible(true);
		demo01 d =c.newInstance();
		demo01 dd =c.newInstance();
		System.out.println(d);
		System.out.println(dd);
发布了8 篇原创文章 · 获赞 0 · 访问量 21

猜你喜欢

转载自blog.csdn.net/richpersion/article/details/105125401